You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:10:29