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

Django工单应用表单字段渲染异常及数据未正确创建求助

问题分析与解决方案

从代码和现象来看,核心问题是表单提交的字段名与视图中获取的键不匹配,导致关键字段无法正确赋值,同时手动创建对象的方式缺乏验证,进一步加剧了数据丢失的问题。

1. 字段名不匹配导致数据无法获取

  • 工单创建模板中,分类输入框的name属性是topic,但视图中尝试获取request.POST.get('category'),两者不匹配,导致category_name为None,最终创建的Category对象name为空。
  • 需同步检查name、description字段的表单name属性是否与视图中request.POST.get('name')、request.POST.get('description')一致,若表单字段名不符,会导致对应字段赋值为None。

修正模板字段名

将分类输入框的name改为category,确保与视图取值键一致:

<!-- 修正后的分类输入框 -->
<span style="white-space: pre-line">
    <label for="room_topic">Enter a Category</label>
    <input required type="text" value="{{ticket.category.name}}" name="category" list="topic-list" />
    <datalist id="topic-list">
        <select id="room_topic">
          {% for category in categories %}
          <option value="{{category.name}}">{{category.name}}</option>
          {% endfor %}
        </select>
    </datalist>
</span>

2. 使用表单类处理提交数据(替代手动取值)

手动从request.POST取值容易出错且缺乏验证,建议利用TicketForm处理表单提交,确保数据合法性:

修改createTicket视图

def createTicket(request):
    if request.method == 'POST':
        form = TicketForm(request.POST)
        if form.is_valid():
            # 获取并关联分类
            category_name = request.POST.get('category')
            category, created = Category.objects.get_or_create(name=category_name)
            
            ticket = form.save(commit=False)
            ticket.host = request.user
            ticket.category = category
            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)

3. 补充表单类定义(若未正确配置)

确保TicketForm包含所有需要提交的字段:

# forms.py
from django import forms
from .models import Ticket

class TicketForm(forms.ModelForm):
    class Meta:
        model = Ticket
        fields = ['name', 'status', 'priority', 'type', 'description']

4. 验证RichTextField的提交

若使用第三方富文本编辑器(如django-ckeditor),需为表单添加enctype="multipart/form-data"属性:

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <!-- 表单内容 -->
</form>

通过以上步骤,即可解决字段显示None及数据未正确创建的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:25:34