登录
首页 >  文章 >  python教程

Django模板变量传值教程详解

时间:2026-03-21 20:45:45 169浏览 收藏

本文深入浅出地讲解了Django模板语言的核心机制与实战要点:从变量渲染的自动HTML转义机制({{ var }})及其安全绕过方式(|safe),到模板标签(如if/for)与Python语法的本质区别及常见误用陷阱;详解static和url标签依赖配置、必须显式load、路径解析逻辑,避免404和NoReverseMatch;并清晰划分filter(适用于简单格式化)与simple_tag(适用于复杂逻辑)的使用边界,强调安全性、性能与可维护性。无论你是刚接触Django模板的新手,还是常踩坑的中级开发者,都能从中获得即学即用的关键避坑指南和最佳实践。

Python Django模板怎么用_DTL模板语言基础语法与后端变量传值渲染前端标签

怎么在 Django 模板里显示后端传来的变量

直接用 {{ variable_name }},Django 会自动做 HTML 转义。比如后端 render(request, 'page.html', {'title': 'Hello & World'}),模板里写 {{ title }} 渲染出来是 Hello & World,不是原始的 & 符号。

常见错误现象:页面上看到 被原样打印,而不是执行——这是正常行为,不是 bug;真要不转义得用 {{ content|safe }},但必须确保内容可信,否则有 XSS 风险。

  • 变量名不能含空格或特殊符号,只支持字母、数字、下划线,且不能以数字开头
  • 支持点号链式访问:{{ user.profile.bio }} 等价于 Python 的 user.profile.bio,任一环节为 None 或不存在就静默返回空字符串
  • 列表索引用点号加数字:{{ items.0 }},不是 {{ items[0] }}

if/for 标签怎么写才不报错

Django 模板里的 {% if %}{% for %} 是标签,不是 Python 语法,不支持表达式运算、函数调用、赋值,只支持有限的比较和逻辑操作符。

使用场景:判断用户是否登录、循环渲染文章列表、按状态区分按钮文案。

  • {% if user.is_authenticated %} ✅;{% if user.is_authenticated() %} ❌(不能加括号调用)
  • {% if a == b and c > 0 %} ✅;{% if a in b %} ❌(不支持 in,改用 {% if b|default:''|add:'x'|contains:a %} 太绕,建议逻辑提前放到上下文)
  • {% for item in items %} ✅;{% for i in 1..10 %} ❌(没有 range 支持,需后端传 range(10) 或用 forloop.counter
  • 记得配对闭合:{% endif %}{% endfor %},漏掉会报 Invalid block tag

为什么 static 和 url 标签总拼错路径

{% load static %}{% url 'name' %} 不是变量,是模板标签,必须先 {% load %} 才能用,且路径解析依赖配置,不是文件系统直读。

常见错误现象:GET /static/css/app.css 404,但文件明明在 static/css/app.css;或者 NoReverseMatch 错误。

  • {% static 'css/app.css' %} 输出的是 settings.STATIC_URL + 'css/app.css',默认是 /static/,所以最终 URL 是 /static/css/app.css,不是 ./css/app.css
  • {% url 'blog:detail' pk=123 %} 中的 'blog:detail' 必须和 urls.pypath('post//', ..., name='detail')name 完全一致,包括命名空间(如 blog:
  • STATICFILES_DIRSSTATIC_ROOT 混用会导致 collectstatic 后找不到文件,开发时优先确认 DEBUG=Truedjango.contrib.staticfilesINSTALLED_APPS

filter 和 simple_tag 怎么选

简单格式化用内置 filter(如 {{ dt|date:'Y-m-d' }}),复杂逻辑或需要多个参数、调用函数,就该写 @register.simple_tag,别硬塞进 filter 里。

性能影响:filter 是单参数为主,执行快;simple_tag 可带任意参数,但每次调用都会执行 Python 函数,频繁渲染大列表时要注意。

  • filter 不能修改原始值,只能返回新值;{{ value|add:'5' }} 返回字符串相加结果,不是数值加法
  • simple_tag 默认不自动转义,返回 HTML 字符串需手动加 mark_safe(),否则会被二次转义
  • 自定义 filter 必须注册到 templatetags/ 下的模块,并在模板顶部 {% load my_filters %},名字冲突不会报错,但后者覆盖前者

最常被忽略的是:template tag 的 Python 文件必须有 __init__.py,且模块名不能和已有内置 filter 重名(比如叫 url.py 就会覆盖 {% url %} 标签)。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Django模板变量传值教程详解》文章吧,也可关注golang学习网公众号了解相关技术文章。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>