zoukankan      html  css  js  c++  java
  • 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最最基本的一些应用,深入的东西等到以后再分享吧。我也还没怎么用过,呵呵~~

  • 相关阅读:
    jquery遍历table的tr获取td的值
    Java判断文件、文件夹是否存在
    项目搭建系列之三:SpringMVC框架下使用Ehcache对象、数据缓存
    J2EE课程设计:在线书店管理系统
    项目搭建系列之二:SpringMVC框架下配置MyBatis
    使用Git(msysgit)和TortoiseGit上传代码到GitHub
    安卓课程设计:微课表
    项目搭建系列之一:使用Maven搭建SpringMVC项目
    常用markdown语法
    [转]优秀程序员应该做的几件事
  • 原文地址:https://www.cnblogs.com/chenjianhong/p/4145086.html
Copyright © 2011-2022 走看看