Django词典应用表单提交后如何保留表单与按钮并展示搜索结果
问题根因
表单消失的核心原因是视图层在POST请求的返回分支中,没有将表单实例传入模板上下文:
- 模板中用于渲染输入框的
{{form}}依赖视图传递的form上下文变量才能正常生成HTML - 你当前的代码在POST请求、表单校验通过时,构造的
context字典仅包含verb/noun/synonyms三个查询结果值,完全遗漏了form变量 - 模板渲染时取不到
form的值,{{form}}会输出为空,最终就只剩下写死在模板中的提交按钮,没有输入框
修正方案
调整视图的代码结构,从根源上避免上下文变量漏传:
- 把所有变量的初始化提前到分支判断之前
- 统一在函数末尾组装上下文、返回渲染结果,不要在中间分支提前return造成漏传
- 无论请求是GET还是POST,都保证
form对象被传入上下文
修正后的视图代码:
def index(request): # 提前初始化所有上下文变量,避免分支漏赋值 form = NameForm() verb = False noun = False synonyms = False if request.method == 'POST': # 绑定POST请求的数据到表单做校验 form = NameForm(request.POST) if form.is_valid(): word = form.cleaned_data['your_name'] # 直接用短路逻辑简化空值判断,和原有逻辑效果一致 verb = Dictionary.get_verb(word) or False noun = Dictionary.get_noun(word) or False synonyms = Dictionary.get_synonyms(word) or False # 查询完成后重置为空表单,提交后输入框变为可再次输入的状态 form = NameForm() # 统一在函数入口组装上下文,所有需要的变量一次性传入,避免漏传 context = { 'form': form, 'verb': verb, 'noun': noun, 'synonyms': synonyms, } return render(request, 'index.html', context)
无需改动的部分
你现有的index.html模板代码完全不需要调整,本身结构是正确的:表单标签、csrf_token、{{form}}、提交按钮的位置都符合预期,只要视图正确传入form上下文,提交后就会正常显示输入框和按钮,同时在下方展示查询结果。
内容的提问来源于stack exchange,提问作者Ashford
相关产品推荐
相关产品推荐

