如何让Django admin.TabularInline不强制要求某些项
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
。