好的,下面将详细介绍 Django 模板语法和 Jinja2 模板语法,包括基本语法、控制结构、过滤器、自定义标签等。
1. Django 模语法
Django 的模板语法主要包括变量、标签、过滤器和模板继承等。以下是各个部分的详细介绍。
1.1 变量
在模板中,可以使用双大括号 {{ }}
来输出变量的值。
示例:
<p>欢迎, {{ user.username }}!</p>
1.2 标签
标签用于执行逻辑操作,通常以 {% %}
包裹。
1.2.1 条件语句
使用 {% if %}
、{% elif %}
和 {% else %}
来进行条件判断。
示例:
{% if user.is_authenticated %}
<p>欢迎回来, {{ user.username }}!</p>
{% else %}
<p>请登录。</p>
{% endif %}
1.2.2 循环
使用 {% for %}
来遍历列表或字典。
示例:
<ul>
{% for post in posts %}
<li>{{ post.title }}</li>
{% endfor %}
</ul>
1.2.3 加载标签
使用 {% load %}
加载自定义标签或过滤器。
示例:
{% load my_tags %}
1.2.4 模板继承
使用 {% extends %}
和 {% block %}
来实现模板继承。
示例:
{% extends 'base.html' %}
{% block title %}首页{% endblock %}
{% block content %}
<h2>这是首页内容</h2>
{% endblock %}
1.3 过滤器
过滤器用于对变量进行处理,使用管道符 |
来应用。
示例:
<p>{{ my_date|date:"Y-m-d" }}</p>
<p>{{ my_string|upper }}</p>
1.3.1 自定义过滤器
可以创建自定义过滤器并在模板中使用。
示例:
# myapp/templatetags/my_filters.py
from django import template
register = template.Library()
@register.filter
def add_suffix(value, suffix):
return f"{value}{suffix}"
在模板中使用:
<p>{{ 'Hello' | add_suffix:', World!' }}</p>
1.4 特殊变量
Django 模板提供了一些特殊变量,如 {{ forloop.counter }}
、{{ forloop.first }}
等。
示例:
<ul>
{% for post in posts %}
<li>{{ forloop.counter }}: {{ post.title }}</li>
{% endfor %}
</ul>
1.5 注释
使用 {# #}
来添加注释,注释不会被渲染。
示例:
{# 这是一个注释 #}
2. Jinja2 模板语法
Jinja2 是一个功能强大的模板引擎,语法与 Django 模板相似,但有一些不同之处。以下是 Jinja2 的主要语法。
2.1 变量
在 Jinja2 中,使用双大括号 {{ }}
来输出变量的值。
示例:
<p>欢迎, {{ user.username }}!</p>
2.2 控制结构
2.2.1 条件语句
使用 {% if %}
、{% elif %}
和 {% else %}
来进行条件判断。
示例:
{% if user.is_authenticated %}
<p>欢迎回来, {{ user.username }}!</p>
{% else %}
<p>请登录。</p>
{% endif %}
2.2.2 循环
使用 {% for %}
来遍历列表或字典。
示例:
<ul>
{% for post in posts %}
<li>{{ post.title }}</li>
{% endfor %}
</ul>
2.3 过滤器
过滤器用于对变量进行处理,使用管道符 |
来应用。
示例:
<p>{{ my_date | date }}</p>
<p>{{ my_string | upper }}</p>
2.3.1 自定义过滤器
可以创建自定义过滤器并在模板中使用。
示例:
# myapp/jinja2.py
from jinja2 import Environment, FileSystemLoader
def add_suffix(value, suffix):
return f"{value}{suffix}"
def environment(**options):
env = Environment(loader=FileSystemLoader('templates'))
env.filters['add_suffix'] = add_suffix # 注册过滤器
return env
在模板中使用:
<p>{{ 'Hello' | add_suffix(', World!') }}</p>
2.4 模板继承
使用 {% extends %}
和 {% block %}
来实现模板继承。
示例:
{% extends 'base.html' %}
{% block title %}首页{% endblock %}
{% block content %}
<h2>这是首页内容</h2>
{% endblock %}
2.5 注释
使用 {# #}
来添加注释,注释不会被渲染。
示例:
{# 这是一个注释 #}
2.6 特殊变量
Jinja2 也提供了一些特殊变量,如 loop.index
、loop.first
等。
示例:
<ul>
{% for post in posts %}
<li>{{ loop.index }}: {{ post.title }}</li>
{% endfor %}
</ul>