31.Django自定义模版

栏目: Python · 发布时间: 6年前

内容简介:Django自定义模版tag在使用模版的时候用到在app目录下面创建一个

Django自定义模版tag

在使用模版的时候用到 {% load static %} 等一系列的 工具 标签,实际上我们也可以自定义这个 标签。

在app目录下面创建一个 templatetags 目录,必须是这个名字,然后创建一个文件 sitetags.py 可以根据自己需求取名 31.Django自定义模版

1.simple_tag()

sitetags.py

from django import template

register = template.Library()


@register.simple_tag
def slide():
    return '这是自定义标签'

此处省略了,view和url的编写

index.html

<!DOCTYPE html>
# 加载标签 名字就是我们在templatetags下新建的
{% load sitetags %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

# 使用模版,是我们等一的方法
{% slide %}
</body>
</html>

31.Django自定义模版

增加参数:

上面我们是写死了结果,这样灵活性严重不足,如果需要修改下文案就无法达到复用的作用了。

修改slide()

@register.simple_tag
def slide(text):
    return text

修改index.html

<!DOCTYPE html>
{% load sitetags %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{% slide '这是带参数的标签'%}
</body>
</html>

刷新浏览器我们将会看到:

这是带参数的标签

获取上下文参数:

上面我们修改成了动态显示内容,那么有时候想要获取整个模版的信息怎么办呢,莫慌,Django已经想到了

再次修改sitetags.py

# 开启上下文,如果设置为True第一个参数必须为context,名字也是固定写法
@register.simple_tag(takes_context=True)
def slide(context, text):
    print(context) # 输出
    return text

可以看到一些请求上下文的封装

[{'True': True, 'False': False, 'None': None}, 
{'csrf_token': <SimpleLazyObject: <function csrf.<locals>._get_val at 0x10f625f28>>, 
'request': <WSGIRequest: GET '/'>, 
'user': <SimpleLazyObject: <function AuthenticationMiddleware.process_request.<locals>.<lambda> at 0x10f625e18>>,
 'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x10f666fd0>, 'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x10f622978>, 
 'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10, 'INFO': 20, 'SUCCESS': 25, 'WARNING': 30, 'ERROR': 40}}, {}]

给标签取一个名字

在模版中我们使用 slide 作为标签名称,这是Django的默认行为:

如果没有单独设置名字就取函数名称.

@register.simple_tag(takes_context=True, name='mytag')
def slide(context, text):
    return text

模版中需要使用 mytag

{% mytag '这是带参数的标签'%}

安全:

为了放置XSS漏洞,Django默认开启了输出转义,比如里面包含html标签输出就是字符串的html标签。 比如:

123

就是远洋输出。

如果希望不按原样输出可以使用 from django.utils.safestring import mark_safe mark_safe() 处理,但是务必确保没有安全问题

如果包含html片段使用 from django.utils.html import format_html format_html()

2.inclusion_tag()

现在都流行组件化开发,实际上django的模版标签就是类似的东西,我们可以将部分功能封装成 标签模版供其他地方使用

修改sitetags.py

@register.inclusion_tag('messages.html')
def messages():
    return {
        'messages': [
            '今天有雨,请带伞出行',
            '雨天出行注意安全',
            '下雨也不要忘了来第八个部落学习',
        ]
    }

在templates目录下创建 messages.html

<ul>
    {% for message in messages %}
        <li>{{ message }}</li>
    {% endfor %}
</ul>

31.Django自定义模版 其他带参数数和context用法同simple_tag,不再赘述。

不使用装饰器注册的方式:

from django.template.loader import get_template
t = get_template('messages.html')
register.inclusion_tag(t)(messages)

以上所述就是小编给大家介绍的《31.Django自定义模版》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Coming of Age in Second Life

Coming of Age in Second Life

Tom Boellstorff / Princeton University Press / 2008-04-21 / USD 29.95

The gap between the virtual and the physical, and its effect on the ideas of personhood and relationships, is the most interesting aspect of Boellstorff's analysis... Boellstorff's portrayal of a virt......一起来看看 《Coming of Age in Second Life》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具