为什么Django使用经filter查询赋值的变量时返回HTML源码而非正常渲染页面
问题根源
你的render函数上下文传参格式错误,是导致页面返回纯文本HTML源码的核心原因。
Django render 函数的参数规范为:render(request, template_name, context=None, content_type=None, status=None, using=None)
- 第三个参数只能接收单个字典作为模板上下文
- 第四个参数是响应的
Content-Type头配置,你误将第二个上下文字典传给了这个位置,导致响应的内容类型标识异常,浏览器不会将其识别为HTML文件渲染,直接输出源码。
修复方案
修改else分支里的render语句,把两个上下文字典合并为单个:
# 原错误代码 # return render(response, 'classy_main/dashboard.html',{"items": todos},{"form":form}) # 修正后 return render(response, 'classy_main/dashboard.html',{"items": todos, "form": form})
其他潜在问题建议优化
- 视图函数第一个参数按照Django规范命名为
request而非response,避免语义混淆 - POST请求分支中,如果表单验证失败,你没有写对应的返回逻辑,此时函数会走到最末尾的
return,但t变量仅在表单验证通过时才定义,会触发UnboundLocalError异常,建议补全逻辑:
def dashboard(request): print(request.user.username) if request.method == 'POST': form = CreateNewList(request.POST) if form.is_valid(): n = form.cleaned_data['name'] t = ToDoList(name=n) t.save() request.user.todolist.add(t) # 验证成功后建议重定向,避免重复提交 return redirect('dashboard') # 替换为你dashboard对应的路由名 # 表单验证失败时直接返回带错误信息的表单 return render(request, 'classy_main/dashboard.html', {"form": form}) else: form = CreateNewList() todos = ToDoList.objects.filter(user=request.user) print(todos) return render(request, 'classy_main/dashboard.html',{"items": todos, "form": form})
内容的提问来源于stack exchange,提问作者curtis Arrisol
相关产品推荐
相关产品推荐

