一、前言
我们之前一直学习模板,然后我们来看看模板除了继承,传值,还可以有哪些操作呢?比如说我们要对后端传过来的值需要做处理,只截取前面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/