Django models 如何从Django管理站点编辑中间多人表中的值?
我希望能够通过Django管理站点在我的数据库中创建鸡尾酒。为此,我有一个“鸡尾酒”模型和一个“配料”模型。它们需要一个多个关系,允许额外的字段“amount\u in\u oz”,因此我使用带有“through”的“IngredientAmount”中间模型。在管理站点中,当我点击“添加鸡尾酒”时,我希望能够命名鸡尾酒,然后从“配料”模型中添加几个项目,同时还指定每个项目的“金额”Django models 如何从Django管理站点编辑中间多人表中的值?,django-models,django-forms,django-admin,many-to-many,Django Models,Django Forms,Django Admin,Many To Many,我希望能够通过Django管理站点在我的数据库中创建鸡尾酒。为此,我有一个“鸡尾酒”模型和一个“配料”模型。它们需要一个多个关系,允许额外的字段“amount\u in\u oz”,因此我使用带有“through”的“IngredientAmount”中间模型。在管理站点中,当我点击“添加鸡尾酒”时,我希望能够命名鸡尾酒,然后从“配料”模型中添加几个项目,同时还指定每个项目的“金额” # models.py---------------------------------------------
# models.py----------------------------------------------------
class Ingredient(models.Model):
name = models.CharField(unique=True, max_length=30)
alcoholic = models.BooleanField(null=False, default=True)
def __str__(self):
return self.name
class Cocktail(models.Model):
name = models.CharField(unique=True, max_length=30)
garnish = models.CharField(max_length=30)
recipe = models.ManyToManyField(Ingredient, through='IngredientAmount')
def __str__(self):
return self.name
class IngredientAmount(models.Model):
cocktail = models.ForeignKey(Cocktail, on_delete=models.CASCADE)
ingredients = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
amount_in_oz = models.FloatField(null=False)
def __float__(self):
return self.amount_in_oz
# admin.py-----------------------------------------------------
class CocktailAdmin(admin.ModelAdmin):
fields = (('name', 'garnish'), )
filter_horizontal = ('recipe', ) # Ideally, this line would have allowed it.
admin.site.register(Ingredient)
admin.site.register(Cocktail, CocktailAdmin)
似乎因为中间表需要额外的输入,filter_horizontal小部件无法处理它
我想知道实现这一点的最佳方法是创建自定义表单还是自定义验证?
或者使用formfield\u overides?
或者为ModelAdmin创建一个新的小部件,比如“FieldIsWalth'”,但是中间有一个文本框来输入值
,您可以使用联接表并生成一个内联:from django.contrib import admin
class IngredientAmountInline(admin.StackedInline):
model = IngredientAmount
class CocktailAdmin(admin.ModelAdmin):
inlines = [
IngredientAmountInline,
]