【问题标题】:custom template operator自定义模板运算符
【发布时间】:2011-04-10 09:49:41
【问题描述】:

有可能吗?

我知道过滤器,但是可以创建这样的东西吗:

{% if 75 is_divisible_by 5 %}

它看起来比:

{% if 75|is_divisible_by:5 %}

(这是一个概念问题,is_divisible_by 只是一个例子)

【问题讨论】:

    标签: django templates django-templates


    【解决方案1】:

    不,没有办法按照您的要求进行操作。

    (注意:切线)但是,如果您只想呈现is_divisible_by 75 5 的值,您可以定义一个自定义模板标签。像这样的:

    @register.tag('is_divisible_by')
    def is_divisible_by(_parser, token):
        try:
            _tag_name, dividend, divisor = token.split_contents()
        except ValueError:
            raise template.TemplateSyntaxError, \ 
                "%r tag requires exactly two arguments" % token.contents.split()[0]
    
        return IsDivisibleBynode(dividend, divisor)
    
    class IsDivisibleBynode(template.Node):
        def __init__(self, dividend, divisor):
            self.dividend = template.Variable(dividend)
            self.divisor = template.Variable(divisor)
    
        def render(self, context):
            return (int(self.dividend.literal)  % int(self.divisor.literal) == 0)
    

    这可以在这样的模板中使用:

    <p>{% is_divisible_by 75 5 %}</p>
    

    当然,这只会打印True,这不是您需要的。我找不到将其与if 条件相结合的方法。也许有更好的模板标签 fu 的人可以告诉我们怎么做。

    【讨论】:

    • 是的,我现在看到唯一的方法(afaik)是重写 if 标记。人们已经使用“智能 if”标签 djangosnippets.org/snippets/1350 完成了此操作,看起来可以修改为添加 is_divisible_by 运算符。我试试看。
    猜你喜欢
    • 2018-09-14
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2022-11-13
    • 2012-11-26
    相关资源
    最近更新 更多