Почему не создается объект базы данных django?
Я пытаюсь создать приложение базы данных напитков на django. Я создал модель drinkRecipe с отношением ManyToManyField к модели Ingredients. Я могу успешно добавить ингредиенты в базу данных через UI приложения, но почему-то при создании напитка я не получаю никаких ошибок и не добавляю напиток в базу данных, вместо возврата на индексную страницу меняется только URL текущей страницы. Что я упускаю?
models.py:
class DrinkRecipe(models.Model):
drinkName = models.CharField(max_length=100)
ingredients = models.ManyToManyField(Ingredients)
utensil = models.IntegerField(choices=requiredUtensil, default=0)
preparation = models.CharField(max_length=1000)
def __str__(self):
return self.drinkName
forms.py:
class DrinkForm(forms.Form):
name = forms.CharField(max_length=100, label="Name:")
utensil = forms.ChoiceField(choices=requiredUtensil, label="Required utensil:")
ingredients = forms.ModelChoiceField(queryset=Ingredients.objects.all(), widget=forms.CheckboxSelectMultiple())
preparation = forms.CharField(widget=forms.Textarea)
views.py:
class AddDrinkView(View):
def get(self, request):
form_drinks = DrinkForm()
drinks_list = DrinkRecipe.objects.all()
context = {
'form_drinks': form_drinks,
'drinks_list': drinks_list,
}
return render(request, 'shakerApp/add_drink.html', context)
def post(self, request):
form_drinks = DrinkForm(request.POST)
if form_drinks.is_valid():
DrinkRecipe.objects.create(
name=form_drinks.cleaned_data('name'),
utensil=form_drinks.cleaned_data('utensil'),
ingredients=form_drinks.cleaned_data('ingredients'),
preparation=form_drinks.cleaned_data('preparation')
)
else:
messages.error(request, "Drink form is invalid.")
return HttpResponseRedirect(reverse('shakerApp:index'))
вместо возврата на индексную страницу меняется только URL текущей страницы. Что я упускаю?
Вероятные причины:
- Форма не действительна, но это не обрабатывается должным образом
- Вызов
DrinkRecipe.objects.create
не срабатывает и отлавливается Django - Вызов
post
терпит неудачу и перехватывается Django
Вы можете отладить это, добавив некоторое утверждение print()
или даже try/except вокруг подозрительной части.
На самом деле, проблема была в форме.
Модель DrinkRecipe состоит из ManyToManyField, и не была правильно использована в соответствующей форме.
По сути, ModelChoiceField
не мог работать с widget=forms.CheckboxSelectMultiple()
. Спасибо @ThePjot за то, что указал мне правильное направление.
Исправлено ниже.
forms.py:
class DrinkForm(forms.Form):
name = forms.CharField(max_length=100, label="Name:")
utensil = forms.ChoiceField(choices=requiredUtensil, label="Required utensil:")
ingredients = forms.ModelMultipleChoiceField(
queryset=Ingredients.objects.all(),
widget=forms.CheckboxSelectMultiple()
)
preparation = forms.CharField(widget=forms.Textarea)