
在 Django 中,需使用 render() 函数(而非 template.render() + HttpResponse)来安全、简洁地将上下文字典传递至模板,否则会导致 HTML 源码直接显示或上下文丢失。
在 django 中,需使用 render() 函数(而非 template.render() + httpresponse)来安全、简洁地将上下文字典传递至模板,否则会导致 html 源码直接显示或上下文丢失。
Django 提供了两种主流方式渲染模板:底层的 Template + Context + HttpResponse 组合,以及更推荐的快捷函数 render()。初学者常因混淆二者而出现“页面显示原始 HTML 代码”或“变量未渲染”等问题——这通常是因为错误地调用了 template.render() 而未传入上下文,或误用 HttpResponse 包裹无渲染结果的字符串。
✅ 正确做法:使用 django.shortcuts.render
该函数自动完成模板加载、上下文绑定与 HTTP 响应封装,一行代码即可完成全部流程:
from django.shortcuts import render
def home(request):
news = [
{'title': 'Django 5.0 发布', 'date': '2023-12-04'},
{'title': 'ORM 性能优化技巧', 'date': '2023-11-28'}
]
context = {
'news': news,
'page_title': '首页新闻'
}
return render(request, 'home.html', context)
⚠️ 注意事项:
-
render()的第三个参数即为上下文字典,无需显式命名context=context(位置参数已约定),但命名写法(如context=context)也完全合法且更清晰; -
request参数必须传入(用于 CSRF 上下文等内置功能),不可省略; - 若手动使用
loader.get_template(),则必须显式创建Context对象并传入render()方法(Django 4.0+ 已弃用Context类,推荐直接传字典):
# ❌ 不推荐(冗余且易错)
from django.template import loader
template = loader.get_template('home.html')
return HttpResponse(template.render(context, request)) # 注意:需传 request!
# ✅ 更现代的底层写法(极少需要)
from django.template.loader import render_to_string
html = render_to_string('home.html', context, request=request)
return HttpResponse(html)
? 小结:始终优先选用 render(request, template_name, context) —— 它是 Django 官方推荐的标准模式,兼具安全性(自动包含 request 相关上下文)、简洁性与可维护性。避免混合使用模板引擎底层 API 与响应类,可大幅降低新手常见渲染异常风险。











