Django Admin后台从一个页面同时编辑多个模型

要从Django Admin后台一个页面同时编辑多个对象,我们需要使用内联。

假设你有一个Category模型,并且需要在Admin后台Category编辑页面,同时编辑Villain模型。你可以在admin.py中使用内联:

python 复制代码
class VillainInline(admin.StackedInline):
    model = Villain
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    ...
    inlines = [VillainInline]

你可以在后台Category编辑页面内部看到添加和编辑Villain的表单。如果Inline包含很多个模型,建议使用使用StackedInline,如果字段较少可以使用TabularInline。

显示效果如下:

以下是来自文心一言的补充:

在您提供的代码片段中,您定义了一个`VillainInline`类,该类继承自`admin.StackedInline`,用于在Django管理界面中将`Villain`模型作为内联(inline)表单展示在`Category`模型的编辑页面上。然后,您注册了一个`CategoryAdmin`类来管理`Category`模型,并在该类中通过`inlines`属性指定了`VillainInline`,这样当编辑`Category`实例时,就可以同时编辑与该`Category`相关联的`Villain`实例了。

这里有几个需要注意的点:

  1. **模型关系**:确保`Villain`模型与`Category`模型之间存在一个合适的外键关系。通常,`Villain`模型中应该有一个指向`Category`的外键字段,比如`category = models.ForeignKey(Category, on_delete=models.CASCADE)`。这样,Django才能理解如何将`Villain`实例作为内联表单展示在`Category`的编辑页面上。

  2. **内联表单的额外配置**:`VillainInline`类还可以包含其他配置,比如`extra`(默认显示的额外内联表单数量)、`max_num`(允许的最大内联表单数量)、`formfield_overrides`(用于覆盖内联表单字段的默认设置)等。这些配置可以根据您的具体需求进行设定。

  3. **CategoryAdmin的其他配置**:`CategoryAdmin`类还可以包含其他配置,比如`list_display`(在列表视图中显示的字段)、`search_fields`(允许搜索的字段)、`filter_horizontal`或`filter_vertical`(用于多对多字段的过滤器)等。这些配置可以让管理界面更加符合您的需求。

  4. **注册和展示**:通过`@admin.register(Category)`装饰器,您已经成功地将`CategoryAdmin`类注册为`Category`模型的管理类。现在,当您访问Django管理界面中的`Category`模型时,就可以看到内联的`Villain`表单了。

  5. **权限和访问控制**:请确保您的用户具有编辑`Category`和`Villain`模型的权限,否则他们可能无法看到或编辑这些内联表单。

  6. **测试**:在部署到生产环境之前,请确保在开发环境中充分测试这些功能,以确保它们按预期工作。

下面是一个简化的示例,展示了如何在`Villain`模型中设置外键,并简要地配置了`VillainInline`和`CategoryAdmin`:

python 复制代码
from django.db import models  
from django.contrib import admin  
  
class Category(models.Model):  
    name = models.CharField(max_length=100)  
  
class Villain(models.Model):  
    name = models.CharField(max_length=100)  
    category = models.ForeignKey(Category, on_delete=models.CASCADE)  
  
class VillainInline(admin.StackedInline):  
    model = Villain  
    extra = 1  # 默认显示一个额外的内联表单  
  
@admin.register(Category)  
class CategoryAdmin(admin.ModelAdmin):  
    inlines = [VillainInline]  
    list_display = ('name',)  # 在Category列表中显示name字段

在这个示例中,我们为`Category`和`Villain`模型设置了简单的字段,并在`Villain`模型中定义了一个指向`Category`的外键。然后,我们定义了`VillainInline`和`CategoryAdmin`类,并将`VillainInline`添加到`CategoryAdmin`的`inlines`属性中。最后,我们通过`list_display`属性在`Category`的列表视图中添加了`name`字段的显示。

相关推荐
golove66621 分钟前
Spring Cloud集成Gateaway
java·spring·spring cloud
NiNg_1_23423 分钟前
后端id设置long类型时,传到前端,超过19位最后两位为00
前端
Lill_bin1 小时前
CAS机制:并发编程中的原子操作
java·服务器·开发语言·windows·算法·微服务
小白小白从不日白1 小时前
react 事件处理
前端·react.js
碎像2 小时前
EasyExcel 快速入门
java·spring boot·easyexcel
ZhangTao_zata2 小时前
前端知识点
前端·javascript·css
GDAL2 小时前
HTML5中`<ul>`标签深入全面解析
前端·html·html5
Damon小智2 小时前
SpringBoot权限认证-Sa-Token的使用与详解
java·spring boot·spring cloud·微服务·sa-token
桃子叔叔2 小时前
前端工程化3:使用lerna管理多包
前端·前端工程化·lerna
祁思妙想2 小时前
《JavaEE进阶》----16.<Mybatis简介、操作步骤、相关配置>
java·java-ee·mybatis