社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

[精华] 发个switch...case...else 标签

cdxfish • 10 年前 • 5146 次点击  

这两天写qm工具,需要在模板上使用类似 switch...case...else的逻辑,baidu发现django15居然木有,无奈之下找了个差不多的,自己改之,共享出来,给有同样需求的同学

__author__ = 'cdxfish'
#coding=utf-8


from django import template
from django.template.base import NodeList,Node
register = template.Library()


'''
{% load switchcase %}
{% switch condition %}
{% case "a" %} if condition==a do .. {% endcase %}
{% case "b" %} if condition==b do .. {% endcase %}
{% else %}
    if condition != a and condition != b....
{% endswitch %}
'''

@register.tag
def switch(parser, token):
    args=token.split_contents()
    if len(args) != 2:
        raise template.TemplateSyntaxError('%s exactly takes 2 args'% args[0])

    nodelist_true = parser.parse(('else', 'endswitch',))
    nodelist_true = nodelist_true.get_nodes_by_type(CaseNode)
    token = parser.next_token()
    if token.contents == 'else':
        nodelist_false = parser.parse(('endswitch',))
        parser.delete_first_token()

    else:
        nodelist_false = NodeList()
    return SwitchNode(args[1], nodelist_true, nodelist_false)



@register.tag
def case(parser, token):
    args=token.split_contents()
    if len(args) != 2:
        raise template.TemplateSyntaxError('%s exactly takes 2 args'% args[0])

    children= parser.parse(('endcase',))
    parser.delete_first_token()
    return CaseNode(args[1],children)


class SwitchNode(template.Node):
    def __init__(self, value, nodelist_true, nodelist_false):
        self.value=value
        self.nodelist_true=nodelist_true
        self.nodelist_false=nodelist_false

    def render(self, context):
        try:
            value = template.resolve_variable(self.value,context)
        except template.VariableDoesNotExist:
            return ""

        for case in self.nodelist_true:
            if case.equals(value, context):
                return case.render(context)

        ret=[]
        for es in self.nodelist_false:
            ret.append(es.render(context))

        return ''.join(ret)

class CaseNode(template.Node):
    def __init__(self, value, childnodes):
        self.value = value
        self.childnodes=childnodes

    def equals(self, otherval, context):
        try:
            return template


    
.resolve_variable(self.value ,context) == otherval
        except template.VariableDoesNotExist:
            return False

    def render(self, context):
        return self.childnodes.render(context)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/336
 
5146 次点击  
文章 [ 2 ]  |  最新文章 9 年前
喔喔喔
Reply   •   1 楼
喔喔喔    9 年前

很好

Lebesgue
Reply   •   2 楼
Lebesgue    10 年前

不错,学习了。