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

Django工单应用创建时出现NOT NULL constraint failed: tickets_ticket.name错误求助

解决Django工单应用创建时NOT NULL constraint failed: tickets_ticket.name错误

问题核心

创建工单时触发非空约束错误,说明Ticket模型的name字段未获取到有效值,导致数据库拒绝插入数据。

原因分析

  1. 视图未使用表单验证逻辑,直接从request.POST取值,无法确保字段值的有效性,也未处理空值场景。
  2. 模板仅渲染了name和description字段,缺少表单其他必要字段,且无提交按钮,导致表单数据提交不完整。
  3. 模型name字段虽设置null=True,但可能未同步到数据库(未执行迁移),或未设置blank=True允许表单空提交。

解决步骤

1. 修正视图逻辑,使用ModelForm处理提交

替换原createTicket视图,利用表单验证确保数据有效性:

def createTicket(request):
    if request.method == 'POST':
        form = TicketForm(request.POST)
        if form.is_valid():
            # 先暂不提交到数据库,手动添加host字段
            ticket = form.save(commit=False)
            ticket.host = request.user
            ticket.save()
            return redirect('ticket', pk=ticket.id)
    else:
        form = TicketForm()
    
    categories = Category.objects.all()
    context = {'form': form, 'categories': categories}
    return render(request, 'projects/ticket_form.html', context)

2. 完善表单模板,渲染所有字段并添加提交按钮

更新工单表单模板,确保所有必要字段都被渲染,同时添加提交按钮:

<div class="main-column">
    <form action="" method="POST">
        {% csrf_token %}
        <div class="form__group">
            <label for="id_name">工单名称</label>
            {{ form.name }}
            {% if form.name.errors %}
                <div style="color:red;">{{ form.name.errors.0 }}</div>
            {% endif %}
        </div>
        <div class="form__group">
            <label for="id_category">分类</label>
            {{ form.category }}
        </div>
        <div class="form__group">
            <label for="id_status">状态</label>
            {{ form.status }}
        </div>
        <div class="form__group">
            <label for="id_priority">优先级</label>
            {{ form.priority }}
        </div>
        <div class="form__group">
            <label for="id_type">类型</label>
            {{ form.type }}
        </div>
        <div class="form__group">
            <label for="id_description">工单描述</label>
            {{ form.description }}
        </div>
        <button type="submit" class="btn">创建工单</button>
    </form>
</div>

3. 同步模型与数据库(执行迁移)

如果模型中name字段是后期添加的null=True,需执行迁移确保数据库表字段同步:

python manage.py makemigrations
python manage.py migrate

4. 优化模型字段定义(可选)

若允许工单名称为空,建议同时设置blank=True(允许表单提交空值):

# 修改models.py中的Ticket.name字段
name = models.CharField(max_length=200, null=True, blank=True)

修改后重新执行迁移命令。

可选:自定义分类输入(而非下拉选择)

若需要用户手动输入分类名称,而非从现有分类选择,可修改TicketForm:

class TicketForm(ModelForm):
    category_name = forms.CharField(max_length=200, label="分类名称", required=True)
    description = forms.CharField(widget=CKEditorWidget())
    
    class Meta:
        model = Ticket
        fields = ['name', 'status', 'priority', 'type', 'description']
        exclude = ['host', 'participants', 'category']
    
    def save(self, commit=True):
        instance = super().save(commit=False)
        # 根据输入的分类名称获取或创建分类
        category_name = self.cleaned_data.get('category_name')
        category, _ = Category.objects.get_or_create(name=category_name)
        instance.category = category
        if commit:
            instance.save()
        return instance

同时在模板中替换form.category为form.category_name:

<div class="form__group">
    <label for="id_category_name">分类名称</label>
    {{ form.category_name }}
</div>

内容的提问来源于stack exchange,提问作者mdaw11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:20:47