django – temlates模板的语法

文章最后更新时间:2024-10-29 15:59:20某些文章具有时效性,若有错误或已失效,请在下方 留言或联系 梦幻屋

Django 的模板语言提供了一个简单而强大的工具,用来编写 HTML 模板并支持动态内容。这里是 Django 模板中常用语法的全面概述,包括变量、控制结构(如 forif 语句)、过滤器等。

1. 变量

在模板中使用双花括号 {{ }} 来输出变量的值:

<p>Hello, {{ username }}!</p>

如果变量是对象的属性或字典的键,可以通过点语法访问:

<p>{{ user.first_name }}</p>
<p>{{ product["name"] }}</p>

2. 过滤器

过滤器是用于修改变量显示的内容的函数,可以通过管道符 | 使用多个过滤器:

<p>{{ name|lower }}</p>        {# 将变量转换为小写 #}
<p>{{ bio|truncatewords:30 }}</p> {# 将字符串截断到 30 个单词 #}

常用过滤器包括:

  • date:格式化日期,如 {{ date|date:"Y-m-d" }}
  • length:获取列表长度,如 {{ items|length }}
  • default:指定默认值,如 {{ name|default:"Unknown" }}
  • join:将列表内容合并为字符串,如 {{ list|join:", " }}

3. 控制结构

Django 模板支持 iffor 等控制结构,用于控制模板的渲染逻辑。

if 语句

if 语句用于条件判断,支持 andor 等逻辑操作符。

{% if user.is_authenticated %}
    <p>Welcome, {{ user.username }}!</p>
{% else %}
    <p>Please log in.</p>
{% endif %}

支持嵌套 if

{% if item %}
    {% if item.price > 100 %}
        <p>This item is expensive.</p>
    {% else %}
        <p>This item is affordable.</p>
    {% endif %}
{% endif %}
支持的条件判断
  • ==:等于
  • !=:不等于
  • <><=>=:比较大小
  • in:检查值是否存在于列表中,如 {% if "apple" in fruits %}
  • not:否定操作,如 {% if not is_member %}

for 循环

for 语句用于循环遍历列表、字典等数据结构。

<ul>
    {% for item in items %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>
forloop 内置变量

for 循环中,Django 提供了 forloop 变量来访问循环信息:

  • forloop.counter:当前循环次数,从 1 开始
  • forloop.counter0:当前循环次数,从 0 开始
  • forloop.revcounter:倒序的循环次数
  • forloop.first:是否为第一次循环
  • forloop.last:是否为最后一次循环
<ul>
    {% for item in items %}
        <li>
            {% if forloop.first %}First: {% endif %}
            {{ item }}
        </li>
    {% endfor %}
</ul>
嵌套循环

可以嵌套 for 循环,使用 . 来访问子项。

{% for category in categories %}
    <h2>{{ category.name }}</h2>
    <ul>
        {% for product in category.products %}
            <li>{{ product.name }} - {{ product.price }}</li>
        {% endfor %}
    </ul>
{% endfor %}

4. 注释

在模板中使用 {# #} 来添加注释,注释不会显示在页面中。

{# 这是一个注释 #}
<p>{{ name }}</p>

5. 模板继承

模板继承允许创建基于基础模板的页面结构。

创建基础模板

定义一个基础模板 base.html,并使用 {% block %} 标签定义可扩展的内容块:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
    <header>
        <h1>Welcome to My Website</h1>
    </header>

    <main>
        {% block content %}{% endblock %}
    </main>

    <footer>
        <p>© 2024 My Website</p>
    </footer>
</body>
</html>

扩展基础模板

在子模板中,使用 {% extends 'base.html' %}{% block %} 重定义内容:

{% extends 'base.html' %}

{% block title %}Homepage{% endblock %}

{% block content %}
    <h2>This is the homepage</h2>
    <p>Welcome to the homepage of My Website.</p>
{% endblock %}

6. 包含模板

使用 {% include %} 来包含其他模板文件,例如导航栏或页脚:

<header>
    {% include 'partials/navbar.html' %}
</header>

7. 其他模板标签

Django 模板还支持其他一些模板标签:

  • {% url 'name' %}:生成 URL,如 <a href="{% url 'home' %}">Home</a>
  • {% csrf_token %}:用于表单的防跨站请求伪造保护
  • {% blocktrans %}:支持国际化文本,如 {% blocktrans %}Hello, world{% endblocktrans %}

8. 实例:使用全部语法示例

假设有以下情境:

  • 需要遍历一个 products 列表,显示每个产品名称和价格。
  • 判断价格,如果价格高于 100,显示“Expensive”。
  • 使用模板继承和 for 循环。
{% extends 'base.html' %}

{% block title %}Product List{% endblock %}

{% block content %}
    <h2>Our Products</h2>
    <ul>
        {% for product in products %}
            <li>
                {{ product.name }} - ${{ product.price }}
                {% if product.price > 100 %}Expensive{% endif %}
            </li>
        {% empty %}
            <p>No products available.</p>
        {% endfor %}
    </ul>
{% endblock %}

希望这些 Django 模板语言的语法和示例对你有所帮助!如果有任何疑问或其他需求,可以进一步咨询。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容