Django循环内表单分配ForeignKey值异常问题求助
解决Django循环内表单ForeignKey分配问题
开发Django问答应用时,在循环内为每个答案添加评论表单(CommentAForm),但提交评论时总是生成问题评论(CommentQForm)的对象,且ForeignKey无法关联到正确的答案。
核心问题分析
- 两个POST请求判断顺序错误:问题评论表单先处理,因两个表单字段均为
comment,导致答案评论的POST请求被问题评论表单拦截 - 答案评论表单初始化未传入POST数据,导致
is_valid()永远返回False - 代码存在变量名笔误:
my_answer_comment_form被误写为my_answer_comment - 模板中折叠框ID重复:所有答案的评论折叠框共用
collapseExample,引发交互异常
具体修复步骤
1. 调整POST请求处理逻辑
将答案评论的POST判断放在问题评论前面,通过隐藏字段answer区分请求类型,同时修正变量名错误:
修改后的views代码:
def view_question(request, slug): question = get_object_or_404(Question, slug=slug) answers = Answer.objects.filter(post=question) answers_comment = CommentA.objects.filter(post__id__in=answers) comment_form = CommentQForm() answer_comment_form = CommentAForm() # 优先处理答案评论的POST请求 if request.method == 'POST': if 'answer' in request.POST: answer_comment_form = CommentAForm(request.POST) if answer_comment_form.is_valid(): my_answer_comment_form = answer_comment_form.save(commit=False) my_answer_comment_form.user = request.user # 通过隐藏字段获取对应答案ID answer_id = request.POST.get('answer') my_answer_comment_form.post = Answer.objects.get(id=answer_id) my_answer_comment_form.save() return redirect('View_Question', slug=slug) else: # 处理问题评论的POST请求 comment_form = CommentQForm(request.POST) if comment_form.is_valid(): my_comment_form = comment_form.save(commit=False) my_comment_form.user = request.user my_comment_form.post = question my_comment_form.save() return redirect('View_Question', slug=slug) context = { "question": question, "answers": answers, "comment_form": comment_form, "answers_comment": answers_comment, "answer_comment_form": answer_comment_form } return render(request, 'view_question.html', context)
2. 修复模板中折叠框ID重复问题
每个答案的折叠框ID需唯一,用answer.id拼接生成:
修改后的模板代码:
{% for answer in answers %} <!-- 原答案展示代码保持不变 --> <div class="add-comment"> <a href="" data-bs-toggle="collapse" data-bs-target="#collapseExample-{{ answer.id }}" aria-expanded="false" aria-controls="collapseExample-{{ answer.id }}"> <small>Add Comment</small> </a> <div class="collapse" id="collapseExample-{{ answer.id }}"> <div class="row"> <div class="col"> {% load crispy_forms_tags %} <form action="" method="post"> {% csrf_token %} {{ answer_comment_form|crispy }} <input type="hidden" name="answer" value="{{ answer.id }}"> <button type="submit" class="btn btn-primary">submit</button> </form> </div> </div> </div> </div> {% endfor %}
3. 可选优化:表单前缀区分(避免字段冲突)
若担心多表单字段冲突,可给表单添加唯一前缀:
# 在循环内初始化表单时(若需要为每个答案生成独立表单实例) answer_comment_form = CommentAForm(prefix=f"answer-{answer.id}")
验证修复效果
- 提交答案评论时,系统会先检测到
answer隐藏字段,触发正确的评论创建逻辑 - ForeignKey将正确关联到对应的答案对象
- 每个答案的评论折叠框独立,交互正常
内容的提问来源于stack exchange,提问作者Bubble
相关产品推荐
相关产品推荐

