为什么不创建 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?
可能的原因:
- 表格无效但处理不当
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)
我正在尝试在 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?
可能的原因:
- 表格无效但处理不当
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)