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

Django表单未获取问题ID,IntegerField返回页面标题问题排查

解决Django表单IntegerField获取到标题而非问题ID的问题

首先,你遇到的问题根本不是模型主键的锅——Django默认就会给模型自动添加自增的id主键,手动写id = models.AutoField(primary_key=True)其实和默认行为完全一致,所以改了也没用,问题出在别的地方。

大概率是前端表单渲染时传错了值:你的question字段定义的是IntegerField,但如果模板里渲染这个字段时,不小心把问题的标题(比如{{ question.title }})设成了input的value,那提交后自然会拿到标题文本,而非ID。

给你具体的排查和修复步骤:

1. 先检查模板里的表单渲染逻辑

确保你正确传递了问题ID作为question字段的取值:

  • 如果是手动写HTML渲染字段:
    <input type="number" name="question" value="{{ question.id }}">
    
  • 如果用Django自带的表单渲染(比如{{ form.question }}),那要在视图初始化表单时,把问题ID设为字段初始值:
    # 视图代码示例
    def add_answer(request, question_id):
        question = get_object_or_404(Question, id=question_id)
        if request.method == 'POST':
            form = AddAnswerForm(request.POST)
            if form.is_valid():
                # 处理表单数据
                answer_text = form.cleaned_data['text']
                target_question_id = form.cleaned_data['question']
                # ... 后续创建Answer对象的逻辑
        else:
            # 初始化表单时把question字段的初始值设为当前问题ID
            form = AddAnswerForm(initial={'question': question.id})
        return render(request, 'your_template.html', {'form': form, 'question': question})
    

2. 完善clean_question方法做验证

你提到的clean_question方法可以补充验证逻辑,确保拿到的ID对应的问题真实存在,避免无效数据:

def clean_question(self):
    question_id = self.cleaned_data.get('question')
    try:
        # 验证ID对应的Question存在,直接返回对象更方便后续使用
        return Question.objects.get(id=question_id)
    except Question.DoesNotExist:
        raise forms.ValidationError("该问题不存在,请检查后重试")

3. 额外建议:如果是选择问题,用ModelChoiceField更省心

如果你的场景是让用户选择问题(而非隐藏传递ID),那完全没必要用IntegerField,直接用ModelChoiceField它会自动处理ID和对象的映射:

class AddAnswerForm(forms.Form):
    text = forms.CharField(widget=forms.Textarea)
    # 自动渲染为下拉框,option的value是问题ID,显示文本是问题标题
    question = forms.ModelChoiceField(queryset=Question.objects.all())

这种情况下,form.cleaned_data['question']会直接返回对应的Question对象,不用再手动处理ID转换。

总结一下:先把前端传递的value改成问题ID,再根据你的业务场景调整字段类型,就能解决拿到标题而非ID的问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:23:26