考虑这些伪模型:
class Category(models.Model):
name = models.CharField()
class Product(models.Model):
name = models.CharField()
code = models.CharField()
category = models.ForeignKey(Category)
price = models.DecimalField()
stock = models.IntegerField()
class AlternativeProduct(Product):
original_product = models.ForeignKey(Product, related_name="alternative", editable=False)
我希望使用内联能够快速添加产品及其替代选项,而无需输入重复数据(仅代码、库存和价格区分)。
管理员.py
class AlternativeProductInline(admin.TabularInline):
model = AlternativeProduct
formset = AlternativeProductInlineFormset
fk_name = "original_product"
fields = ["code", "price", "in_stock"]
max_num = 1
extra = 0
class ProductAdmin(admin.ModelAdmin):
form = ProductAdminForm
inlines = [AlternativeProductInline]
当然这会提高ValidationError
,因为少AlternativeProduct
了一个category
。
现在我可以设置一个默认值来解决这个问题:
class Product(models.Model):
name = models.CharField()
code = models.CharField()
category = models.ForeignKey(Category, default=1)
price = models.DecimalField()
stock = models.IntegerField()
但除了这个 id 可能不存在的事实之外,它仍然需要更正。是否有任何其他方式(除了 Javascript)将正品产品的类别值复制到替代内联产品“引擎盖下”
我曾尝试更改 admin_view,但它变得 hackish,也许自定义视图将是一个不错的解决方案,尽管 javascript 是一种不太耗时的方法。