您能想到在模板渲染过程中将文本字段评估为模板的简单方法吗?
我知道如何在视图中执行此操作,但我正在寻找模板过滤器或标记?
类似的东西:
{{ object.textfield|evaluate}}
要么
{% evaluate object.textfield %}
object.textfield包含如下内容:
a text with a {% TemplateTag %}.
由于TemplateTag
过滤器,将评估evaluate
。
答案 0 :(得分:11)
这是第一个解决我的问题的Tag实现:
from django import template
register = template.Library()
@register.tag(name="evaluate")
def do_evaluate(parser, token):
"""
tag usage {% evaluate object.textfield %}
"""
try:
tag_name, variable = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
return EvaluateNode(variable)
class EvaluateNode(template.Node):
def __init__(self, variable):
self.variable = template.Variable(variable)
def render(self, context):
try:
content = self.variable.resolve(context)
t = template.Template(content)
return t.render(context)
except template.VariableDoesNotExist, template.TemplateSyntaxError:
return 'Error rendering', self.variable
答案 1 :(得分:1)
它将涉及正则表达式。我不太擅长的东西,我写了一个例子,但是你(或其他人)会(我保证)有更有效的方法来做这件事。但这只是一个例子:
from django.template import Library, Node, TemplateSyntaxError
from django.template import Template, Context
register = Library()
class TemplateEvalNode(Node):
def __init__(self, value):
self.value = Variable(value)
def render(self, context):
value = self.value.resolve(context)
regex = re.compile('{% \w+ %}')
# Grab the template tag (eg. {% TemplateTag %})
unevaluated_var = regex.search(value)
if unevaluated_var == None:
return value
# Create a template containing only the template tag
t = Template(unevaluated_var)
# Evaluate that template (with context)
return_var = t.render(Context(context))
# Return the original value with the template tag replaced with
# its actual value
return value.replace(unevaluated_var, return_var)
def template_eval(parser, token):
bits = token.contents.split()
if len(bits) != 2:
raise TemplateSyntaxError, "template_eval takes exactly one argument"
return TemplateEvalNode(bits[1])
template_eval = register.tag(template_eval)
我还没有测试过,所以它可能无法直接运行,但理论上你可以运行:
{% template_eval object.textfield %}
它会回来:
a text with a VALUE_OF_TEMPLATETAG.
期待对此进行更新,因为我现在要测试它并尝试修复任何问题,我的电池即将死亡,所以我现在发布这个未经测试的。
同时期待一个比我更擅长Python的人更聪明的解决方案:p。
编辑:好的,我太慢了,你打败了我!