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)
Как я понимаю, встроенные наборы форм могут быть ответом здесь, но я немного не понимаю, как действовать дальше. Если это так, то где определяется набор встроенных форм и как он включается в представление?
Любые комментарии, указывающие мне правильное направление, были бы очень полезны, связанные со встроенными наборами форм или другими! Спасибо!