Django атрибут "многие ко многим" с моделью "через" отображается на родительской форме

Я новичок в Django и уже несколько дней бьюсь головой об стол, пытаясь разобраться в этом вопросе. Заранее извиняюсь, если это уже спрашивали/отвечали.

Я создаю базовое приложение для отслеживания инвентаризации в ресторане, которое позволяет пользователю создавать инвентаризацию ингредиентов, создавать меню и создавать пункты в этих меню. При создании товара пользователь должен иметь возможность определить ингредиенты, которые идут на изготовление этого товара, и количество каждого ингредиента, которое требуется.

При создании пункта меню я пытаюсь создать форму, которая позволяет пользователю назвать пункт, указать его цену, затем добавить ингредиенты по одному, причем количество ингредиента выбирается по мере добавления ингредиента. То есть что-то вроде этого:

Имя: _______

Цена: _______

Ингредиент: ______ Количество: _______

Ингредиент: ______ Количество: _______

Ингредиент: ______ Количество: _______

[кнопка Добавить еще один ингредиент]

Вот мой текущий код:

# models.py

class Ingredient(models.Model):
    GRAM = 'GR'
    OUNCE = 'OZ'
    ITEM = 'IT'

    UNIT_CHOICES = [
        ('GR', 'Grams'),
        ('OZ', 'Ounces'),
        ('IT', 'Item')
    ]

    name = models.CharField(max_length=200)
    unitType = models.CharField(max_length=2, choices=UNIT_CHOICES, default=ITEM)
    unitCost = models.DecimalField(max_digits=10, decimal_places=2)
    inventoryQuantity = models.DecimalField(max_digits=10, decimal_places=2)
    
    def __str__(self):
        return self.name

class Menu(models.Model):
    name = models.CharField(max_length=200)
    timeCreated = models.DateTimeField(auto_now=True)
    timeUpdated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.name)

class MenuItem(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    ingredients = models.ManyToManyField(Ingredient, through='IngredientQuantity')
    menu = models.ForeignKey(Menu, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.name

class IngredientQuantity(models.Model):
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    menuItem = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    ingredientQuantity = models.IntegerField(default=0)

    def __str__(self):
        return str(self.ingredient)

# forms.py

class MenuCreateForm(forms.ModelForm):
    class Meta:
        model = Menu
        fields = ['name']

class ItemCreateForm(forms.ModelForm):
    class Meta:
        model = MenuItem
        fields = '__all__'
        exclude = ['menu',]
    
    ingredients = forms.ModelMultipleChoiceField(queryset=Ingredient.objects.all(), widget=forms.CheckboxSelectMultiple) # I realize this multiple choice format may not be necessary, but just including here for completion
# views.py

def ItemCreate(request, pk):
    menu = Menu.objects.get(id=pk)
    form = ItemCreateForm()

    if request.method == 'POST':
        form = ItemCreateForm(request.POST)
        if form.is_valid():
            item = form.save(commit=False)
            item.menu = menu
            item.save()
            form.save_m2m()
            return redirect('menuview', menu.id)

    context = {'form': form, 'menu': menu}
    return render(request, 'inventory/itemCreate.html', context)

Как я понимаю, встроенные наборы форм могут быть ответом здесь, но я немного не понимаю, как действовать дальше. Если это так, то где определяется набор встроенных форм и как он включается в представление?

Любые комментарии, указывающие мне правильное направление, были бы очень полезны, связанные со встроенными наборами форм или другими! Спасибо!

Вернуться на верх