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

embedded/2024/12/23 3:04:52/

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

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

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`:

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


http://www.ppmy.cn/embedded/107962.html

相关文章

算法day22|组合总和 (含剪枝)、40.组合总和II、131.分割回文串

算法day22|组合总和 (含剪枝)、40.组合总和II、131.分割回文串 39. 组合总和 (含剪枝)40.组合总和II131.分割回文串 39. 组合总和 (含剪枝) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 ta…

iOS——frame和bounds的区别

把frame理解为占用区域,把bounds理解为边界。View在旋转过程中,其实自己的坐标系统并没有发生改变,bounds中的origin只能通过setBounds方法修改。 frame 定义了视图在其父视图坐标系统中的位置和大小。其坐标系是相对于俯视图的坐标系。 bou…

Java 基于微信小程序的小区服务管理系统,附源码

博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

LeetCode560. 和为 K 的子数组(2024秋季每日一题 12)

给你一个整数数组 n u m s nums nums 和一个整数 k k k ,请你统计并返回 该数组中和为 k k k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2 示例 2: 输入&…

代码随想录Day 32|leetcode题目:501.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 动态规划理论基础一、理论基础1.1 什么是动态规划1.2 动态规划的解题步骤1.3 动态规划应该如何debug 二、题目题目一: 509. 斐波那契数解题思路:动态规划递归解法 题目二&a…

集成 Logrus 到 Gin:打造高效的 Go Web 日志系统

在 Go 语言的 Web 开发中,Gin 是一个轻量级且高性能的 Web 框架,而 Logrus 则是一个非常流行的日志库,它提供了结构化的日志记录功能。将 Logrus 集成到 Gin 框架中,可以极大地增强你的 Web 应用程序的日志管理能力。本文将详细介…

Java中将函数作为参数传入方法并回调

用于记录&#xff0c;方便后面cv 定义方法类 import java.util.Timer; import java.util.TimerTask; import java.util.function.Function; public class Utils {public static void reqData(String url, String param,Function<String,String> callBack) {System.ou…

栈区-----顺序栈------队列

栈 栈&#xff08;Stack&#xff09;是一种遵循后进先出&#xff08;LIFO, Last In First Out&#xff09;原则的有序集合。这种数据结构只允许在栈顶进行添加&#xff08;push&#xff09;或删除&#xff08;pop&#xff09;元素的操作。换句话说&#xff0c;最新添加的元素会…