Django
自定义过滤器就是一个带有一个或两个参数的Python 函数:
- - (输入的)变量的值 —— 不一定是字符串形式。
- - 参数的值 —— 可以有一个初始值,或者完全不要这个参数。
注册自定义过滤器
- django.template.Library.filter()
- Library.filter()方法需要两个参数:
- 过滤器的名称(一个字符串对象)
- 编译的函数 – 一个Python函数(不要把函数名写成字符串)
- 可以把register.filter()用作装饰器;
- 没有声明 name 参数,Django将使用函数名作为过滤器的名字。
首先需要新建一个包,以APP的形势存在(加入到INSTALLED_APPS中),例如新建一个comment的包(就是一个comment的文件夹,里面包含一个init的py文件)
然后在里面新建一个包,固定名字为templatetags,在里面新建一个py文件(自定义)
在settings中添加
my_filter中:定义了一个replace得过滤器,还有一个title得过滤器
from django import template register = template.Library() @register.filter() def my_cut(value, arg): return value.replace(arg, '') @register.filter # 这个括号可以不加,还可以在括号里面重命名方法名 def my_capfirst(value): return value.title()
views中:
from django.shortcuts import render def diy_filter(request): return render(request, 'DIY/diy.html', context={ 'string': 'hello django', })
定义好url路径和视图,在html中:
{% load my_filter %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定义内容</title> <style> </style> </head> <body> <p>{{ string }}</p> <p>django自带的首字母大写:{{ string|capfirst }}</p> <p>自定义的首字母大写:{{ string|my_capfirst }}</p> <p>django自带的cut:{{ string|cut:' ' }}</p> <p>自定义的cut:{{ string|my_cut:' ' }}</p> </body> </html>
- 简单标签 django.template.Library.simple_tag()
- 包含标签 django.template.Library.inclusion_tag()
tag()方法有两个参数:
- 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。
- 编译的函数 – 一个Python函数(不要把函数名写成字符串)与过滤器注册一样,也可以将其用作装饰器。
自定义简单标签
urls路径一样,视图添加一个时间格式
views:
from django.shortcuts import render def diy_filter(request): return render(request, 'DIY/diy.html', context={ 'string': 'hello django', 'time_format': '%Y年%m月%d日 %H:%M:%S', })
my_filter:
from django import template from datetime import datetime register = template.Library() # 自定义标签 # 简单标签 @register.simple_tag def current_time(): time_format = '%Y年%m月%d日 %H:%M:%S' return datetime.now().strftime(time_format) @register.simple_tag def current_time1(time_format): return datetime.now().strftime(time_format) # 简单标签+上下文 @register.simple_tag(takes_context=True) def current_time2(context): time_format = context.get('time_format') return datetime.now().strftime(time_format)
html中:
{% load my_filter %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定义内容</title> <style> </style> </head> <body> <p>方法里面传参:{% current_time %}</p> <p>页面直接传参:{% current_time1 '%Y年%m月%d日 %H:%M:%S' %}</p> <p>上下文传参:{% current_time2 %}</p> </body> </html>
包含标签的功能是可以通过渲染另外一个模板来显示一些数据
例如很多地方都可能会用到下面这几行代码,除了choices这个变量不一样之外,其他的都是格式都一样时,那么我们就可以把这部分代码封装在一个包含标签中.
<ul>
{% for i in choices %}
<li>{{ i }}</li>
{% endfor %}
</ul>
定义一个show_tags的html文件
% for foo in choice %} <li>foo</li> {% endfor %}
在views中添加一个列表:
from django.shortcuts import render def diy_filter(request): return render(request, 'DIY/diy.html', context={ 'list':['apple', 'pear', 'orange'], })
my_filter中:
from django import template
from datetime import datetime
register = template.Library()
# 包含标签
@register.inclusion_tag('DIY/show_tags.html')
def tags1():
li = ['a', 'b', 'c']
return {'choice': li}
@register.inclusion_tag('DIY/show_tags.html')
def tags2(li):
return {'choice': li}
@register.inclusion_tag('DIY/show_tags.html', takes_context=True)
def tags3(context):
return {'choice': context.get('list')}
html中
{% load my_filter %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定义内容</title> <style> </style> </head> <body> <p>方法里面传参:{% tags1 %}</p> <p>content里面传参:{% tags2 list %}</p> <p>上下文传参:{% tags3 %}</p> </body> </html>