如何在 django admin 中自定义多对多内联模型

Posted

技术标签:

【中文标题】如何在 django admin 中自定义多对多内联模型【英文标题】:How to customize a many-to-many inline model in django admin 【发布时间】:2011-02-23 01:10:20 【问题描述】:

我正在使用管理界面查看发票和产品。为方便起见,我将产品设置为内联到发票,因此我将在发票的表单中看到相关产品。如您所见,我使用的是多对多关系。

在models.py中:

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)

在 admin.py 中:

class ProductInline(admin.StackedInline):
    model = Invoice.products.through

class InvoiceAdmin(admin.ModelAdmin):
    inlines = [FilteredApartmentInline,]
admin.site.register(Product, ProductAdmin)

问题在于 django 将产品显示为下拉菜单表(每个关联产品一个)。每个下拉列表都包含列出的所有产品。因此,如果我有 5000 个产品并且 300 个与某个发票相关联,那么 django 实际上会加载 300x5000 个产品名称。桌子也不美观。

我不需要通过发票表格更新产品。我该如何更改它,以便它只在内联表中显示产品名称? 我应该覆盖哪个表单,以及如何覆盖?

【问题讨论】:

在 admin.py InvoiceAdmin 中必须是 inlines=[ProductInline] 【参考方案1】:

我觉得很简单,不要使用内联,直接使用属性ModelAdmin.filter_horizontal

【讨论】:

这完全回答了我的问题。但现在我有一个跟进 - 这显示了产品名称列表 - 如果我需要它作为产品的链接以便我可以从发票链接到产品怎么办? 当您在 Invoice 中选择产品并保存链接两个对象的对象时 提供的链接已失效 @VKroz 我修复了链接。这是针对 django 1.2(提出问题时的当前 django),现在我放了 django 1.7 的链接。

以上是关于如何在 django admin 中自定义多对多内联模型的主要内容,如果未能解决你的问题,请参考以下文章

在 Django admin 中添加内联多对多对象

如何按字母顺序对多对多 django-admin 框中的值进行排序?

在 Django Admin 中过滤多对多框

Django admin,多对多字段,多个重复条目

在 django admin 中使用 related_name 配置多对多字段

Python入门自学进阶-Web框架——6Django的ORM-多对多admin应用