如何自定义Django管理中多对多内联模型

6 投票
1 回答
6162 浏览
提问于 2025-04-15 23:04

我正在使用管理界面查看发票和产品。为了方便,我把产品设置为与发票一起显示,这样我就能在发票的表单中看到相关的产品。正如你所看到的,我使用的是多对多的关系。

在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个产品名称。而且这个表格看起来也不太美观。

我不需要通过发票表单来更新产品。怎么才能改成只在内联表格中显示产品的名称呢?我应该重写哪个表单,怎么做?

1 个回答

4

我觉得这个问题很简单,不要使用内联的方式,直接用属性 ModelAdmin.filter_horizontal 就可以了。

撰写回答