django自定义标签tag

自定义标签:
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最最基本的一些应用,深入的东西等到以后再分享吧。我也还没怎么用过,呵呵~~

原文地址:https://www.cnblogs.com/chenjianhong/p/4145086.html