为什么不创建 Django 数据库对象?

Why isn't a django database object created?

我正在尝试在 Django 中创建一个饮料数据库应用程序。我创建了一个 drinkRecipe 模型,它与 Ingredients 模型有 ManyToManyField 关系。我可以通过应用 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'))

*根据@Bono 建议编辑更改括号

**编辑:所以,我是个白痴,没有在模板中添加 method='post'。这解决了我在点击提交后停留在 add_drink 视图的部分,但是,数据库仍然没有更新。

instead of going back to the index page only the URL of current page changes. What am I missing?

可能的原因:

  1. 表格无效但处理不当
  2. DrinkRecipe.objects.create 调用失败并被 Django 捕获
  3. 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)