【问题标题】:How to get Django admin.TabularInline to NOT require some items如何让 Django admin.TabularInline 不需要某些项目
【发布时间】:2026-02-20 21:50:01
【问题描述】:
class LineItemInline(admin.TabularInline):
    model = LineItem
    extra = 10

class InvoiceAdmin(admin.ModelAdmin):
    model = Invoice
    inlines = (LineItemInline,)

class LineItem(models.Model):
    invoice = models.ForeignKey(Invoice)
    item_product_code = models.CharField(max_length=32)
    item_description = models.CharField(max_length=64)
    item_commodity_code = models.ForeignKey(CommodityCode)
    item_unit_cost = models.IntegerField()
    item_unit_of_measure = models.ForeignKey(UnitOfMeasure, default=0)
    item_quantity = models.IntegerField()
    item_total_cost = models.IntegerField()
    item_vat_amount = models.IntegerField(default=0)
    item_vat_rate = models.IntegerField(default=0)

当我这样设置时,管理界面要求我将数据添加到所有十个 LineItems。 LineItems 有必填字段,但如果没有输入数据,我希望它不需要整个行项目。

【问题讨论】:

    标签: python django


    【解决方案1】:

    这很奇怪,它不应该那样做 - 如果你没有输入任何东西,它不应该要求任何数据。

    我想知道default 选项是否导致它感到困惑。同样,Django 应该处理这个问题,但尝试删除这些,看看会发生什么。

    还要注意:

    item_unit_of_measure = models.ForeignKey(UnitOfMeasure, default=0)
    

    无效,因为 0 不能是 UnitOfMeasure 对象的 ID。如果您希望不需要 FK,请在字段声明中使用 null=True, blank=True

    【讨论】:

      【解决方案2】:

      原来问题是默认值。上面提到的关于 UnitOfMeasure 的问题并不是真正的问题,任何具有 default= 的字段都会导致它要求存在其余数据。这对我来说似乎是一个错误,因为在确定记录中是否有任何需要保存的内容时应该减去默认值,但是当我删除所有默认值时,它会起作用。

      在这段代码中, item_unit_of_measure = models.ForeignKey(UnitOfMeasure, default=0) 这是让数据库中的第 0 个条目成为默认值的一种偷偷摸摸的方式。不幸的是,正如他所指出的那样,这不起作用。

      【讨论】:

      • 奇数。您使用的是旧版本的 Django 吗?大约一年前(code.djangoproject.com/ticket/7975)修复了这个错误,修复中包含了测试,所以如果它倒退,我会感到惊讶。
      最近更新 更多