Django模板系统完全指南:从语法到高级技巧全解析

引言  

        掌握Django模板系统是构建动态网站的核心技能,本文将深入剖析其语法原理、过滤器妙用和组件化开发技巧,助你提升开发效率!

目录

引言  

一、Django模板语法基础 

1. 核心语法规则 

2. 变量解析实例

二、过滤器(Filters)深度解析

1. 常用内置过滤器

2. 日期格式化速查表

三、模板标签(Tags)实战 

1. 循环控制 for 

2. 条件判断 if 

3. 其他关键标签 

四、模板继承与组件化

1. 母板设计(base.html)

2. 子模板继承

3. 组件复用

五、高级扩展:自定义标签

1. 创建自定义filter

2. 创建inclusion_tag

六、避坑指南与最佳实践

总结

扩展学习:


一、Django模板语法基础 

1. 核心语法规则 


{{ variable }}


{% tag %}
  • 变量命名规则:字母/数字/下划线组合(不能含空格或标点)

  • 点号.的解析顺序

    1. 字典查询 dict['key']

    2. 属性/方法查询 obj.attributeobj.method()

    3. 数字索引 list.0

  • 特性:方法调用不能传参数,变量不存在时返回空字符串

2. 变量解析实例

{{ 1.0 }}          
{{ d.name }}       
{{ person_list.0.name }}  
{{ obj.method }}   

二、过滤器(Filters)深度解析

通过管道符 | 修改变量输出

1. 常用内置过滤器

过滤器 作用 示例
default 空值默认值 {{ value|default:"nothing" }}
length 获取长度 {{ list|length }}
filesizeformat 文件尺寸格式化 {{ 123456789|filesizeformat }} → 117.7 MB
slice 切片操作 {{ "hello"|slice:"2:-1" }} → "ll"
date 日期格式化 {{ now|date:"Y-m-d H:i:s" }}
truncatechars 字符截断 {{ "abcd"|truncatechars:9 }} → "abc..."
truncatewords 单词截断 {{ "a b c d"|truncatewords:2 }} → "a b ..."
cut 移除指定字符 {{ "i love"|cut:" " }} → "ilove"
join 列表连接 {{ list|join:", " }}
safe 禁用HTML转义 {{ html_content|safe }}

2. 日期格式化速查表

字符 说明 示例
Y 四位数年份 2023
m 两位月份 07
d 两位日期 05
H 24小时制 14
i 分钟 30
s 45
D 星期缩写 Mon

三、模板标签(Tags)实战 

1. 循环控制 for 

    {% for user in user_list %}
  • {{ forloop.counter }}. {{ user.name }}
  • {% empty %}
  • 空空如也
  • {% endfor %}

循环变量详解

  • forloop.counter:当前循环索引(从1开始)

  • forloop.revcounter:倒序索引值

  • forloop.first:是否为首次循环(布尔值)

  • forloop.parentloop:外层循环对象

2. 条件判断 if 

{% if user_list|length > 5 %}
   六座豪华SUV
{% elif user_list|length > 2 %}
   家用轿车
{% else %}
    自行车
{% endif %}

支持运算符==, >, <, !=, in, not in, is

3. 其他关键标签 


{% with total=users.count %}
    {{ total }} 用户{{ total|pluralize }}
{% endwith %}


{% csrf_token %}
{# 此内容不会渲染 #}

四、模板继承与组件化

1. 母板设计(base.html)




    {% block title %}默认标题{% endblock %}
    {% block css %}{% endblock %}


    {% block content %}
    
    {% endblock %}
    
    {% block js %}{% endblock %}

2. 子模板继承

{% extends "base.html" %}

{% block title %}子页面标题{% endblock %}

{% block content %}
  

自定义内容

{% endblock %}

3. 组件复用


{% include 'navbar.html' %}


{% load static %}



{% get_static_prefix as STATIC_PREFIX %}

五、高级扩展:自定义标签

1. 创建自定义filter

步骤

  1. 在app下创建templatetags

  2. 编写过滤器文件(如my_filters.py

# my_filters.py
from django import template
register = template.Library()

@register.filter(name="add_str")
def add_string(value, arg):
    return f"{value}-{arg}"
{% load my_filters %}
{{ "hello"|add_str:"world" }}  

2. 创建inclusion_tag

返回HTML片段

# my_tags.py
@register.inclusion_tag('result.html')
def show_list(n):
    return {'items': range(1, n+1)}

    {% for item in items %}
  • Item {{ item }}
  • {% endfor %}

模板调用

{% show_list 5 %}

六、避坑指南与最佳实践

  1. 禁止连续判断:不支持 {% if a>b>c %}

  2. 属性优先于方法{{ data.items }} 优先取字典key而非方法

  3. 过滤器链式操作{{ text\|truncatewords:10\|upper }}

  4. 静态文件路径:使用 {% static %} 替代硬编码路径

  5. HTML转义:慎用 |safe,仅在完全信任内容时使用

总结

        Django模板系统通过优雅的语法分离了业务逻辑与展示层,结合模板继承、自定义标签等特性,可大幅提升开发效率。本文涵盖的过滤器妙用组件化方案高级扩展技巧,已在实际项目中得到验证,助力开发者构建更易维护的Web应用。

扩展学习

  • Django官方模板文档

  • 实战:Django组件库开发

你可能感兴趣的:(django,python,后端)