django自定义标签tag

本文介绍如何在Django中创建自定义模板标签,包括编写编译函数、渲染器及注册标签的过程。通过实例展示了如何定义一个显示当前时间的模板标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义标签:
1.编写编译函数
例如:
{% current_time "%Y-%m-%d %I:%M %P" %}
编译函数如下:
from django import template
def do_current_time(parser,token):
try:
tag_name,format_string=token.split_contents()
except :
raise template.TemplateSyntaxError ("tag requires a single argument ")
if not(format_string[0]==format_string[-1] and format_string[0] in ('"',"'")):
raise template.TemplateSyntaxError("%r tag's argument should be in quotes")%tag_name
return CurrentTimeNode(format_string[1:-1])

token.contents是一个字符串,这里是“current_time "%Y-%m-%d %I:%M %P"”
token.split_contents()方法将参数按照空格分隔,但是不会将引号中的内容进行拆分。
token.contents.split()会直接的分隔所有的空格,不够健壮。所以最好使用token.split_contents()方法。
tag_name是标签的名字token.contents.split()[0]通常都会是你的标签的名字。就算没有参数。
传递给CurrentTimeNode的参数为"%Y-%m-%d %I:%M %p" 。模板标签开头和结尾的引号使用 format_string[1:-1] 除去。
模板标签编译函数 必须 返回一个 Node 子类,返回其它值都是错的。

2.编写renderer(渲染器)
编写一个Node的子类,包含一个render()方法。
from django import template
import datetime
class CurrentTimeNode(template.Node)
def __init__(self,format_string):
self.format_string=format_string
def render(self,context):
return datetime.datetime.now().strftime(self.format_string)
注意:
render不能报异常。

3.注册标签
register.tag('current_time',do_current_time)
需要两个参数:
第一个就是模板标签的名字,第二个是编译函数。
也可以使用@register.tag(name='current_time')

完整例子:

mytag.py:

from django import template
register=template.Library()
@register.tag(name='mytag')
def do_parse(parser,token):
    try:
        tag_name,format_string=token.split_contents()
    except :
        raise template.TemplateSyntaxError(" tag  error!")
    return Mytag(format_string[1:-1])

class Mytag(template.Node):
    def __init__(self,format_string):
        self.format_string=format_string
    def render(self, context):
        return self.format_string
#register.tag('mytag',do_parse)

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>
{% load mytag %}
{% endfor %}
{% mytag '陈建虹!' %}
</body>
</html>


这里演示的都是tag最最基本的一些应用,深入的东西等到以后再分享吧。我也还没怎么用过,呵呵~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值