内容简介:Django自定义模版tag在使用模版的时候用到在app目录下面创建一个
Django自定义模版tag
在使用模版的时候用到 {% load static %} 等一系列的 工具 标签,实际上我们也可以自定义这个 标签。
在app目录下面创建一个 templatetags 目录,必须是这个名字,然后创建一个文件 sitetags.py 可以根据自己需求取名
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>
增加参数:
上面我们是写死了结果,这样灵活性严重不足,如果需要修改下文案就无法达到复用的作用了。
修改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() 处理,但是务必确保没有安全问题
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>
其他带参数数和context用法同simple_tag,不再赘述。
不使用装饰器注册的方式:
from django.template.loader import get_template
t = get_template('messages.html')
register.inclusion_tag(t)(messages)
以上所述就是小编给大家介绍的《31.Django自定义模版》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 腾讯 Tars-Go 服务获取自定义模版(配置)值
- 聊一聊Vue组件模版,你知道它有几种定义方式吗?
- 小说精品屋 - plus v3.3.0发布,支持前端多模版自定义
- Django的模版引擎与模版使用
- 常见算法模版总结(一)
- 常见算法模版总结(二)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。