Django:如何用CreateView创建含外键模型并解决完整性错误?
解决Django CreateView创建含外键模型时的NOT NULL约束错误
你遇到的NOT NULL constraint failed: pizzas_topping.pizza_id错误,本质是创建Topping实例时没有为外键pizza赋值——数据库要求这个字段非空,但当前代码里没有把URL中传递的pizza pk关联到新的Topping对象上。
以下是具体修复步骤:
1. 修改CreateView,自动关联外键实例
重写NewTopping的form_valid方法,从URL参数中获取对应的Pizza对象,绑定到要创建的Topping实例上:
from django.shortcuts import get_object_or_404 from .models import Pizza from django.views.generic.edit import CreateView class NewTopping(CreateView): model = Topping template_name = "pizzas/new_topping.html" form_class = ToppingForm def form_valid(self, form): # 从URL的pk参数获取对应的Pizza,不存在则返回404 pizza = get_object_or_404(Pizza, pk=self.kwargs['pk']) # 将Pizza实例绑定到要创建的Topping form.instance.pizza = pizza # 调用父类方法完成保存 return super().form_valid(form)
2. 修正模板的表单提交路径
你的URL需要接收pk参数,所以模板里的{% url 'new_topping' %}需要传递对应的pizza pk:
<form action="{% url 'new_topping' pk=pizza.pk %}" method="post"> {% csrf_token %} {{form.as_p}} <input type="submit" value="submit"> </form>
注意:模板上下文需要包含pizza对象。如果是从Pizza详情页跳转到这个添加页面,跳转链接要传递pk:
<!-- 示例:在Pizza详情页的跳转链接 --> <a href="{% url 'new_topping' pk=pizza.pk %}">添加新配料</a>
完成以上两步后,提交表单时,系统会自动将URL指定的Pizza关联到新创建的Topping,不会再触发非空约束错误。
内容的提问来源于stack exchange,提问作者Duka93
相关产品推荐
相关产品推荐

