在Django中,有一种简单的方法可以在模板中将文本字段呈现为模板吗?

时间:2009-08-14 14:04:11

标签: django templates filter tags

您能想到在模板渲染过程中将文本字段评估为模板的简单方法吗?

我知道如何在视图中执行此操作,但我正在寻找模板过滤器或标记?

类似的东西:

{{ object.textfield|evaluate}} 要么 {% evaluate object.textfield %}

object.textfield包含如下内容:

a text with a {% TemplateTag %}.

由于TemplateTag过滤器,将评估evaluate

2 个答案:

答案 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。

编辑:好的,我太慢了,你打败了我!