kawaz.core.templatetags.templatetags.expr のソースコード

# ref: https://djangosnippets.org/snippets/9/
import re
from django import template
from django.utils.translation import ugettext_lazy

register = template.Library()


[ドキュメント]class ExprNode(template.Node): def __init__(self, expression, variable=None): self.expression = expression self.variable = variable
[ドキュメント] def render(self, context): d = {'_': ugettext_lazy} for x in iter(context): d.update(x) if self.variable: context[self.variable] = eval(self.expression, d) return '' else: return str(eval(self.expression, d))
expr_r = re.compile(r'(.*?)\s+as\s+(\w+)', re.DOTALL) @register.tag('expr')
[ドキュメント]def do_expr(parser, token): """ テンプレート内でPythonの機能を実行し描画 or 変数代入するタグ Syntax: {% expr <expression> (as <variable) %} Example: {# 2 を描画 #} {% expr 1 + 1 %} {# 10 を foo に代入 #} {% expr 1 + 9 as foo %} {# foo を使って掛け算し描画 #} {% expr foo * 100 %} """ bits = token.contents.split(None, 1) if len(bits) < 2: raise template.TemplateSyntaxError( "%r tag requires argument" % bits[0] ) m = expr_r.search(bits[1]) if m: expression, variable = m.groups() else: expression, variable = bits[1], None return ExprNode(expression, variable)