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`字段的显示。

相关推荐
刘恒1234567898 小时前
Windows 电脑文件夹手动分类指南
java·windows·python·电脑·php
爱学习的小可爱卢8 小时前
JavaSE基础-Java异常处理全解析:从ClassNotFound到IndexOutOfBounds
java·javase
小王不爱笑1328 小时前
LangChain4j 项目实战--1:硅谷小智(医疗智能客服)笔记
java
XiaoLeisj8 小时前
Android Activity 页面导航基础:Manifest 声明、Intent 显式/隐式跳转与数据传递
android·java
忍者必须死8 小时前
JDK1.7的HashMap的环形链表
java·数据结构·算法·链表
鹿角片ljp8 小时前
短信登录:基于 Session 实现(黑马点评实战)
java·服务器·spring boot·mybatis
NEXT068 小时前
数组转树与树转数组
前端·数据结构·面试
北风toto8 小时前
JDK8(JAVA)供应商说明
java·开发语言
清水白石0088 小时前
观察者模式全解析:用 Python 构建优雅的事件系统,让组件彻底解耦
java·python·观察者模式
We་ct8 小时前
浏览器 Reflow(重排)与Repaint(重绘)全解析
前端·面试·edge·edge浏览器