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/

posted @ 2018-03-27 17:11  帅丶高高  阅读(196)  评论(0编辑  收藏  举报