day20-自定义simple_tag
一、前言
我们之前一直学习模板,然后我们来看看模板除了继承,传值,还可以有哪些操作呢?比如说我们要对后端传过来的值需要做处理,只截取前面30个字符,或者说我想把这小写的字母变成大写,或者说由大写变成小写什么的,那在模板里面我们又怎么搞呐?虽然这些是自带的,但是那我们需要一些自定义的,我们怎么去自己去定义自己的simple_tag呐,这个又叫模板的自定义函数?下面我们就来学习学习。
二、django提供的simple_filter
说明:以下这些可以直接拿过来用的
{{ item.event_start|date:"Y-m-d H:i:s"}} #把datatime类型的转化为时间类型 {{ bio|truncatewords:"30" }} #只截取bio字符串的前30个,后面的就扔了 {{ my_list|first|upper }} #拿到my_list的字符串的第一个字符,然后转换为大写 {{ name|lower }} #拿到name字符串,然后小写
举例使用:
<body> {{ name }}<br/> {{ name|lower }} </body>
三、自定义simple_tag
3.1、前提
说明:project.settings.py文件需要设置添加INSTALLED_APPS下的app和TEMPLATES下的OPTIONS
a、添加app
说明:在settings中配置当前app,不然django无法找到自定义的simple_tag,这个一开始创建项目的就应该加上
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', #添加app01 )
如图:
b、添加libraries
说明:在settings中指定你所在的libraries,不然找不到
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], 'libraries': { # Adding this section should work around the issue. 'staticfiles' : 'django.templatetags.static', }, }, }, ]
如图:
3.2、自定义simple的步骤
a、在app中创建templatetags模块
说明:注意了,这个templatetags不能是其他名字,目录只能叫templatetags,如图:
b、创建任意 .py 文件,如:sgg.py
from django import template from django.utils.safestring import mark_safe register = template.Library() #这个register对象名字也不能是其他名字,只能叫register @register.simple_tag def my_simple_time(v1,v2,v3): return v1 + v2 + v3 @register.simple_tag def my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result)
如图:
c、在使用自定义simple_tag的html文件中导入之前创建的 sgg.py 文件名
{% load sgg %}
如图:
d、使用simple_tag
{% my_simple_time 1 2 3 %} {% my_input 'id_username' 'hide' %}
如图:
e、用as自定义的simple_tag取别名
说明:如果我们获取到了simple_tag的值,但是我们需要用模板语言用到,我们可以用as来取别名,然后在下面用for循环使用
<tbody> {% get_query_sets admin_class as query_sets %} <!--起一个变量名--> {% for obj in query_sets %} <!--用for循环去取query_sets中的值--> <tr> <td>{{ obj }}</td> </tr> {% endfor %} </tbody>
更多见文档:https://docs.djangoproject.com/en/2.0/ref/templates/language/