Django models 如何从Django管理站点编辑中间多人表中的值?

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---------------------------------------------

我希望能够通过Django管理站点在我的数据库中创建鸡尾酒。为此,我有一个“鸡尾酒”模型和一个“配料”模型。它们需要一个多个关系,允许额外的字段“amount\u in\u oz”,因此我使用带有“through”的“IngredientAmount”中间模型。在管理站点中,当我点击“添加鸡尾酒”时,我希望能够命名鸡尾酒,然后从“配料”模型中添加几个项目,同时还指定每个项目的“金额”

# 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,
    ]