自定义 Django 管理界面中的多对多内联模型

news2024/11/16 9:50:04

在这里插入图片描述

1. 问题背景

在 Django 管理界面中,用户可以使用内联模型来管理一对多的关系。但是,当一对多关系是多对多时,Django 提供的默认内联模型可能并不适合。例如,如果存在一个产品模型和一个发票模型,并且产品和发票之间是多对多的关系,那么在发票的管理界面中,Django 会显示一个表格,其中包含所有产品及其对应的复选框。这种形式的内联模型对于管理少量产品还可以接受,但是如果产品数量很多,那么这种内联模型就会非常不美观和难以使用。

2. 解决方案

为了解决这个问题,我们可以自定义多对多内联模型的显示方式。具体步骤如下:

  1. 创建一个新的内联模型类。这个类继承自 admin.TabularInlineadmin.StackedInline

  2. 在新的内联模型类中,重写 get_formset() 方法。这个方法负责返回一个表单集,表单集中的每个表单对应于内联模型中的一个对象。

  3. get_formset() 方法中,使用 formset_factory() 函数创建表单集。在 formset_factory() 函数中,指定 model 参数为内联模型的模型类,并指定 fields 参数为内联模型中需要显示的字段。

  4. 在新的内联模型类中,重写 has_add_permission()has_change_permission() 方法。这两个方法分别负责判断用户是否有添加和修改内联模型对象

  5. 将新的内联模型类添加到 ModelAdmin 类中。在 ModelAdmin 类的 inlines 属性中,添加新的内联模型类。

下面是一个示例代码,演示了如何自定义多对多内联模型的显示方式:

from django.contrib import admin
from django.contrib.admin.utils import NestedObjects

class Product(models.Model):
    name = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)

class Invoice(models.Model):
    company = models.ForeignKey(Company)
    customer = models.ForeignKey(Customer)
    products = models.ManyToManyField(Product)

class InvoiceAdmin(admin.ModelAdmin):

    # 使用 formset_factory() 函数创建表单集
    def get_formset(self, request, obj=None, **kwargs):
        formset_class = super().get_formset(request, obj, **kwargs)
        formset_class = formset_factory(InvoiceProductFormset, extra=0,
                                        fields=('product',))
        return formset_class

    # 重写 has_add_permission() 和 has_change_permission() 方法
    def has_add_permission(self, request, obj=None):
        return False

    def has_change_permission(self, request, obj=None):
        return False

class InvoiceProductFormset(admin.BaseInlineFormSet):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        NestedObjects(self)

    # 重写 get_queryset() 方法
    def get_queryset(self):
        qs = super().get_queryset()
        # 过滤掉已经被删除的对象
        return qs.filter(is_deleted=False)

# 将自定义的内联模型类添加到 ModelAdmin 类中
admin.site.register(Invoice, InvoiceAdmin)

在上面的代码中,我们首先创建了一个新的内联模型类 InvoiceProductFormset。这个类继承自 admin.BaseInlineFormSet。然后,我们在 InvoiceProductFormset 类中重写了 get_formset() 方法、has_add_permission() 方法和 has_change_permission() 方法。最后,我们将 InvoiceProductFormset 类添加到 InvoiceAdmin 类中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1864930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LICEcap最轻便的C++开源GIF录制工具汉化版本

LICEcap是一款开源的、跨平台的GIF动画录制工具,它使用C编写,旨在为用户提供简单、高效且功能丰富的屏幕录制体验。无论是Windows、macOS还是Linux(通过WINE模拟器),LICEcap都能轻松捕获屏幕上的动态内容,并…

VB列表框

移动是将列表框1中选中的数字移动到列表框2中。 全部是将列表框1中所有数字移动到列表框2中。 Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim i As Integer, a As IntegerRandomize()For i 0 To 9a Int(Rnd() * 90) …

Trip.com 如何从 Elasticsearch 迁移到 ClickHouse 并构建了 50PB 的日志解决方案

本文字数:8721;估计阅读时间:22 分钟 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 在 Trip.com,我们为用户提供广泛的数字产品,包括酒店和机票预订、景点、旅游套餐、商务…

玩个游戏 找以下2个wordpress外贸主题的不同 你几找到几处

Aitken艾特肯wordpress外贸主题 适合中国产品出海的蓝色风格wordpress外贸主题,产品多图展示、可自定义显示产品详细参数。 https://www.jianzhanpress.com/?p7060 Ultra奥创工业装备公司wordpress主题 蓝色风格wordpress主题,适合装备制造、工业设备…

红酒达人教你秘技:选酒、存酒,一招一式皆学问

在繁忙的都市生活中,红酒不仅仅是一种饮品,更是一种生活态度,一种品味的象征。然而,面对琳琅满目的红酒品牌与种类,如何选择一瓶心仪的红酒,又如何妥善保存,使其保持很好口感,成为了…

数据库字段不区分大小写

如果你的数据库也是这个排序规则,那么就没法区分大小写。常用的是这样的建表语句。它的collate已经声明为ci(不区分大小写) 这个时候你Cao和cao当作条件去查询其实作用是一样的,查出来的东西一模一样。 想要区分也很简单&#xff…

Web 权限管理最佳实践:如何提升用户满意度与应用安全性?

引言 在当今数字化时代,Web应用的功能和复杂性不断增加,用户对在线服务的期望也在不断提升。为了提供丰富的用户体验,许多Web应用需要访问用户的个人信息或设备功能,如地理位置、摄像头和麦克风等。这些权限访问在提升应用功能的…

倾斜摄影OSGB一键轻量化输出3dTiles!

老子云为打通OSGB应用通路,研发了OSGB格式一键转换3dTiles技术服务,通过轻量化操作即可快速实现格式间的转换,并且转换后模型可直接使用amrt展示框架加载、二次开发深度应用,此项服务已在平台上线,欢迎用户体验。接下来…

38 - 换座位(高频 SQL 50 题基础版)

38 - 换座位 -- 方法一 select(casewhen id%21 and id(select max(id) from seat) then idwhen id%20 then id-1else id1end) as id, student fromseat order byid;-- 方法二selectif(id%20,id-1,if(id(select max(id) from Seat),id,id1)) as id,student fromSeat order by id…

Ant Design Vue Upload 自定义上传 customRequest,这一篇很详细

Upload 常用属性和方法 示例上传接口 # 接口文档 url https://www.mocky.io/api/main/upload 头部 x-token: xxx 参数 file: File // 上传的文件 flag: xxx // 上传的标识// 文件上传 api 函数简单封装 export const uploadApi ({ file }) > {const formData new Fo…

Java医院绩效考核系统源码 :3分钟带你了解(医院绩效考核系统有哪些应用场景)三级公立医院绩效考核系统源码

Java医院绩效考核系统源码 :3分钟带你了解(医院绩效考核系统有哪些应用场景)三级公立医院绩效考核系统源码 作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和…

2024系统分析师考试总结

考试缘由 我自己在毕业不久就考过了中级的软件设计师,这几年换到外企后事情不多,今年初定计划的时候就想着不如考个系统分析师吧。为什么选这个类别呢?按道理我主做程序开发,如果去考系统架构师通过率可能会大一些,但…

深度神经网络(dnn)--风格迁移(简单易懂)

概括 深度神经网络(DNN)在风格迁移领域的应用,实现了将一幅图像的艺术风格迁移到另一幅图像上的目标。该技术基于深度学习模型,特别是卷积神经网络(CNN),通过提取内容图像的内容特征和风格图像的…

JAVA应用开发和.net应用开发可以一起学吗?

JAVA应用开发和.NET应用开发同时学习是可行的,但需要记住几个关键点,以确保学习效率和理解深度。刚好我有一些资料,是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信…

uniapp横屏移动端卡片缩进轮播图

uniapp横屏移动端卡片缩进轮播图 效果&#xff1a; 代码&#xff1a; <!-- 简单封装轮播图组件:swiperCard --> <template><swiper class"swiper" circular :indicator-dots"true" :autoplay"true" :interval"10000&quo…

JAVA小知识29:IO流(上)

IO流是指在计算机中进行输入和输出操作的一种方式&#xff0c;用于读取和写入数据。IO流主要用于处理数据传输&#xff0c;可以将数据从一个地方传送到另一个地方&#xff0c;例如从内存到硬盘&#xff0c;从网络到内存等。IO流在编程中非常常见&#xff0c;特别是在文件操作和…

Git的安装配置及使用(超详细!!!)

一、git概述 它是一个版本管理工具. 版本: 软件开发过程当中的重要节点. 作用: 团队协作,管理代码. 对于软件的学习, 会用就行. 1.1 安装及配置 下载地址: github.com 安装注意事项: 傻瓜式安装,一直下一步就好. 安装目录不要有中文. 尽量也不要有空格. 配置环境变量: 找到…

1亿参数的细胞大模型来了!登Nature子刊,清华大学团队发布scFoundation:对2万基因同时建模

近年来&#xff0c;大规模预训练模型正在引领新一轮人工智能浪潮。「大模型」通过从大规模、多来源的数据中提取深层次规律&#xff0c;进而能够作为「基础模型」服务不同领域的多样化任务。例如&#xff0c;大语言模型通过学习大量文本数据&#xff0c;掌握了理解和识别语言的…

Python 列表去重方法解析与使用详解

概要 在 Python 编程中,列表是非常常用的数据结构之一。由于在实际使用中,我们经常会遇到包含重复元素的列表,因此对列表进行去重操作是一个常见的需求。本文将详细介绍多种 Python 列表去重的方法,并提供相应的示例代码,帮助更好地掌握这些技术。 使用集合(set) 集合…

充电桩现场安装施工流程

摘要&#xff1a;在化石能源日益紧缩的今天&#xff0c;新能源车辆逐渐走进了千家万户&#xff0c;与传统化石能源车辆相比&#xff0c;以电驱动的新能源车辆能源利用率高&#xff0c;缩短了能源传递过程&#xff0c;实现了能源有效利用。根据能量守恒定律可知&#xff0c;任何…