我有两个 django 模型(简化):
class Product(models.Model):
name = models.TextField()
price = models.IntegerField()
class Invoice(models.Model):
company = models.TextField()
customer = models.TextField()
products = models.ManyToManyField(Product)
我希望在管理员的发票页面中将相关产品视为一个漂亮的表格(产品字段),并能够链接到各个产品页面。
我的第一个想法是使用管理员的内联 - 但 django 为每个相关产品使用了一个选择框小部件。这没有链接到产品页面,而且因为我有成千上万的产品,而且每个选择框都独立下载所有产品名称,所以它很快变得非常慢。
所以我转而按照建议使用 ModelAdmin.filter_horizontal here ,它使用了不同小部件的单个实例,其中您有一个所有产品的列表和另一个相关产品的列表,您可以在后者中添加/删除前者的产品。这解决了速度慢的问题,但它仍然没有显示相关的产品字段,而且它不可链接。
那么,我该怎么办?调整意见?重写 ModelForms?我用 Google 搜索了一下,找不到此类代码的任何示例...
最佳答案
也许这不是您所期望的,但我会介绍 InvoiceItem 模型,它将 Invoice 链接到 Product。所以你会有 2x 1:n 而不是 m:n 关系。然后使用 InvoiceItem 的内联自定义表单和该表单中的 raw_id_fields 进行产品选择。
在 InvoiceItem 表单中,您可以添加只读字段来显示您需要显示的值。您必须在 Form 的 init 中为这些字段提供数据,以从 InvoiceItem 实例中读取它们。或者您也可以从 raw_id_field 小部件派生并在此小部件的渲染方法中附加一些来自产品模型的额外数据?
关于python - 格式化 django admin 中呈现的内联多对多相关模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908410/