1.代码布局(自定义的代码,位置)
- 某个app特有的
- app 目录下,创建 templatetags(python包)
- templatetags 创建python文件
- 复用过滤器及标签
- 创建一个新的app,将他们定义在新的app中,再注册
2.自定义模板标签
-
简单标签
from datetime import datetime from django.template import Library register = Library() def current_time(format_str): return datetime.now().strftime(format_str) register.simple_tag(current_time, name='current')
from datetime import datetime from django.template import Library register = Library() @register.simple_tag(name='current') def current_time(format_str): return datetime.now().strftime(format_str)
{% load customer_tag %} <h1>当前时间: {% current '%Y-%m-%d %H:%M:%S'%}</h1>
- 引用上下文变量(views中传递到模板利用context)
需要@register.simple_tag(name='current', takes_context=True)
自定义的标签函数的第一个参数一定是 contextfrom datetime import datetime from django.template import Library register = Library() @register.simple_tag(name='current', takes_context=True) def current_time(context): return datetime.now().strftime(context['format_str'])
from django.views import View from django.shortcuts import render class Index(View): def get(self, request): format_str = '%Y-%m-%d %H:%M:%S' return render(request, 'index/home.html', context={ 'format_str' : format_str, })
{% load customer_tag %} <h1>当前时间: {% current %}</h1>
3.自定义模板过滤器
- 模板过滤器的定义
- 即函数,一般有一个或两个参数
- 第一个参数,是传递进来的模板变量
- 第二个参数,普通的参数,也可以是默认,也可以不要
- 即函数,一般有一个或两个参数
- 注册
- 通过 django.template.Library 它的实例的 filter 方法
- filter 有两个参数:
- name 过滤器的名称即起别名,字符串格式,默认使用方法名作为过滤器的名称
- filter_func 定义的过滤器的函数对象
from django.template import Library # 定义变量register 为Library实例对象 -- 固定格式 register = Library() def to_male(value, arg='zh'): map = { 'zh':('女','男'), 'en':('female','male'), } return map[arg][value] register.filter(to_male)
- 通过装饰器
from django.template import Library # 定义变量register 为Library实例对象 register = Library() @register.filter def to_male(value, arg='zh'): map = { 'zh':('女','男'), 'en':('female','male'), } return map[arg][value]
- 使用
- load python模块名
-
{% load customer_filter %}
-
<td>{{ student.sex|to_male:'en'}}</td>
- load python模块名