你好,
在管理面板中,我创建了用于添加产品的表单。表单包括 2 个内联表单集,因为有一些与产品相关的模型。用户可以创建产品,然后定义该产品的不同属性的变体。我将举例说明这一点。用户拥有一个品牌的 3 种不同颜色的 T 恤,并希望以不同的价格添加它们。T 恤被创建为具有 3 种变化的产品。
class Detail(models.Model):
product = models.ForeignKey('Product')
attribute = models.ForeignKey('Attribute')
value = models.CharField(max_length=500)
class Attribute(models.Model):
name = models.CharField(max_length=300)
class Variant(models.Model):
product = models.ForeignKey(Product)
details = models.ManyToManyField(Detail)
quantity = models.IntegerField()
price = models.DecimalField(max_digits=6, decimal_places=2)
我省略了 Product,因为它无关紧要。
class DetailInline(admin.TabularInline):
model = Detail
class VariantInline(admin.StackedInline):
model = Variant
class ProductAdmin(admin.ModelAdmin):
class Meta:
model = Product
inlines = [DetailInline, VariantInline]
这很好用,模型保存得很好,我对 Variants inline 有问题。内联变体显示 Detail 对象,但仅显示已保存在数据库中的对象。为了使用户的生活更轻松,最好在创建 Detail 对象时将 Detail 对象添加到 Variant inline,因此必须在保存 Product 之前发生。
- 有没有办法用值手动刷新内联?
- 有没有可以用来创建 Detail 对象而不是 Product 并返回结果的中间保存?
- 模型应该重新设计吗?(我真的不想这样做,除非我必须这样做)
- 用户是否需要遵循不同的工作流程来添加产品?
我曾尝试使用 js 将条目注入内联,但这是 hackish 并且 Django 没有验证带有假值的表单集,抛出错误,即选择了错误的值。
在我写这个问题时,我想到的最后想法。可以创建 js,以防万一对象的内联形式发生更改,会将数据传递给自定义视图,该视图将创建对象并返回结果。我看到的一个问题(除了感觉不对)是如何通知 django 创建了新对象,这样它就不会引发关于不存在值的错误。
无论如何,我希望有人能理解这个冗长的问题。