如何让Django admin.TabularInline不强制要求某些项

0 投票
2 回答
1178 浏览
提问于 2025-04-15 14:11
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)添加数据。这些项目有一些必填的字段,但我本以为如果没有输入数据,就不需要填写整个项目。

2 个回答

0

原来问题出在默认值上。上面提到的关于单位测量(UnitOfMeasure)的问题其实不是主要问题,任何带有default=的字段都会要求其他数据必须存在。我觉得这像是个bug,因为在判断记录中是否有需要保存的数据时,默认值应该被忽略。但是当我去掉所有默认值后,代码就能正常工作了。

在这段代码中,
    item_unit_of_measure = models.ForeignKey(UnitOfMeasure, default=0)
这里用0作为数据库中默认值的方式有点狡猾。但不幸的是,正如他所指出的,这种方法并不奏效。

1

这很奇怪,按理说不应该这样 - 如果你没有输入任何内容,它不应该要求一行数据。

我在想,default 选项是不是让它搞混了。虽然 Django 应该能处理这个问题,但你可以试着去掉这些选项,看看会发生什么。

另外要注意的是:

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

这个是不合法的,因为 0 不能作为一个单位对象的 ID。如果你希望外键(FK)不是必填的,可以在字段声明中使用 null=True, blank=True

撰写回答