跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Django模板语法
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Django模板语法 = Django模板系统是Django框架中用于生成动态HTML的核心组件之一。它允许开发者将Python代码与HTML分离,同时提供了一套简洁而强大的语法来处理数据展示、逻辑控制和模板继承等任务。本章将详细介绍Django模板语法的各个方面,从基础到高级用法。 == 简介 == Django模板语法主要包含以下三类标记: * '''变量''':用于显示上下文中的数据 * '''标签''':提供逻辑控制结构 * '''过滤器''':修改变量的显示方式 模板系统设计遵循"业务逻辑与表现分离"的原则,使得前端开发者和后端开发者可以更好地协作。 == 变量 == 变量是模板中最基本的元素,用于输出上下文中的值。变量使用双花括号<code>{{ }}</code>表示。 === 基本语法 === <syntaxhighlight lang="django"> <p>欢迎, {{ user.username }}!</p> <p>当前时间: {{ current_time }}</p> </syntaxhighlight> === 变量查找规则 === Django模板系统按照以下顺序查找变量: 1. 字典查找(如<code>user["username"]</code>) 2. 属性查找(如<code>user.username</code>) 3. 方法调用(无参数方法) 4. 列表索引查找(如<code>list.0</code>) == 标签 == 标签提供了模板中的逻辑控制结构,使用<code>{% %}</code>语法。 === 常用标签 === ==== if标签 ==== <syntaxhighlight lang="django"> {% if user.is_authenticated %} <p>欢迎回来, {{ user.username }}!</p> {% else %} <p>请<a href="/login">登录</a>。</p> {% endif %} </syntaxhighlight> ==== for标签 ==== <syntaxhighlight lang="django"> <ul> {% for item in item_list %} <li>{{ forloop.counter }}. {{ item.name }}</li> {% empty %} <li>没有可显示的项目</li> {% endfor %} </ul> </syntaxhighlight> ==== block和extends标签 ==== 用于模板继承: '''base.html''' <syntaxhighlight lang="django"> <!DOCTYPE html> <html> <head> <title>{% block title %}默认标题{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html> </syntaxhighlight> '''child.html''' <syntaxhighlight lang="django"> {% extends "base.html" %} {% block title %}子页面标题{% endblock %} {% block content %} <h1>这是子页面的内容</h1> {% endblock %} </syntaxhighlight> == 过滤器 == 过滤器用于修改变量的显示,使用管道符号<code>|</code>。 === 常见过滤器 === <syntaxhighlight lang="django"> {{ name|lower }} {# 转换为小写 #} {{ bio|truncatewords:30 }} {# 截断为30个单词 #} {{ value|date:"Y-m-d" }} {# 日期格式化 #} {{ list|join:", " }} {# 列表连接 #} </syntaxhighlight> === 自定义过滤器 === 1. 在app目录下创建<code>templatetags</code>目录 2. 创建<code>__init__.py</code>文件 3. 创建自定义过滤器文件(如<code>custom_filters.py</code>) 示例: <syntaxhighlight lang="python"> from django import template register = template.Library() @register.filter(name='cut') def cut(value, arg): return value.replace(arg, '') </syntaxhighlight> 使用: <syntaxhighlight lang="django"> {% load custom_filters %} {{ "Hello World"|cut:" " }} {# 输出: HelloWorld #} </syntaxhighlight> == 模板继承 == Django模板系统最强大的功能之一是模板继承,它允许你构建一个基础"骨架"模板,然后子模板可以覆盖其中的部分内容。 === 继承层次结构 === <mermaid> graph TD A[base.html] --> B[child.html] A --> C[another_child.html] B --> D[grandchild.html] </mermaid> === 多级继承示例 === '''grandbase.html''' <syntaxhighlight lang="django"> <!DOCTYPE html> <html> <head> <title>{% block title %}Grand Base Title{% endblock %}</title> </head> <body> {% block main %}{% endblock %} </body> </html> </syntaxhighlight> '''base.html''' <syntaxhighlight lang="django"> {% extends "grandbase.html" %} {% block main %} <header>{% block header %}默认头部{% endblock %}</header> <div class="content"> {% block content %}{% endblock %} </div> <footer>{% block footer %}默认页脚{% endblock %}</footer> {% endblock %} </syntaxhighlight> '''page.html''' <syntaxhighlight lang="django"> {% extends "base.html" %} {% block title %}页面标题{% endblock %} {% block header %} <h1>自定义头部</h1> {% endblock %} {% block content %} <p>这是页面的主要内容。</p> {% endblock %} </syntaxhighlight> == 国际化支持 == Django模板支持国际化标签,便于创建多语言网站。 <syntaxhighlight lang="django"> {% load i18n %} <h1>{% trans "Welcome" %}</h1> <p>{% blocktrans with name=user.username %}Hello {{ name }}!{% endblocktrans %}</p> <p>{% trans "There is" %} {% pluralize item_count "one item" "many items" %}</p> </syntaxhighlight> == 安全考虑 == Django模板系统默认自动转义HTML特殊字符,防止XSS攻击。如果需要显示原始HTML,可以使用<code>safe</code>过滤器或<code>autoescape</code>标签。 <syntaxhighlight lang="django"> {{ user_input }} {# 自动转义 #} {{ html_content|safe }} {# 不转义 #} {% autoescape off %} {{ html_content }} {% endautoescape %} </syntaxhighlight> == 性能优化 == * 使用<code>{% include %}</code>标签拆分大型模板 * 合理使用<code>{% cache %}</code>标签缓存模板片段 * 避免在模板中进行复杂计算 * 使用<code>select_related</code>和<code>prefetch_related</code>优化数据库查询 == 实际应用案例 == === 电子商务产品页面 === <syntaxhighlight lang="django"> {% extends "shop/base.html" %} {% block title %}{{ product.name }}{% endblock %} {% block content %} <div class="product-detail"> <h1>{{ product.name }}</h1> <p class="price">${{ product.price }}</p> {% if product.in_stock %} <form action="{% url 'cart:add' product.id %}" method="post"> {{ cart_product_form }} {% csrf_token %} <input type="submit" value="加入购物车"> </form> {% else %} <p class="out-of-stock">缺货</p> {% endif %} <div class="description"> {{ product.description|linebreaks }} </div> <h2>类似商品</h2> <div class="similar-products"> {% for similar in similar_products %} <div class="item"> <a href="{{ similar.get_absolute_url }}"> <img src="{{ similar.image.url }}" alt="{{ similar.name }}"> <p>{{ similar.name }}</p> </a> </div> {% empty %} <p>暂无类似商品</p> {% endfor %} </div> </div> {% endblock %} </syntaxhighlight> == 总结 == Django模板语法提供了一套强大而灵活的工具来创建动态网页,同时保持了代码的整洁和可维护性。通过本章的学习,你应该已经掌握了: * 变量、标签和过滤器的基本用法 * 模板继承的组织方式 * 国际化和安全相关的模板特性 * 实际项目中的应用技巧 掌握这些概念后,你将能够构建结构良好、易于维护的Django应用程序界面。 [[Category:后端框架]] [[Category:Django]] [[Category:Django模板系统]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)