代码之家  ›  专栏  ›  技术社区  ›  Pierre-Jean Coudert

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

  •  3
  • Pierre-Jean Coudert  · 技术社区  · 15 年前

    能否想出一种简单的方法,在模板呈现期间将文本字段作为模板进行计算。

    比如:

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

    object.textfield包含以下内容:

    a text with a {% TemplateTag %}.

    TemplateTag 将进行评估,感谢 evaluate

    2 回复  |  直到 15 年前
        1
  •  12
  •   Pierre-Jean Coudert    15 年前

    下面是解决我的问题的第一个标记实现:

    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
    
        2
  •  1
  •   user116170    15 年前

    它将涉及正则表达式。有些事情我不太擅长,我已经写了一个例子,但你(或这里的其他人)将(我保证)有一个更有效的方法来做这件事。但这只是一个例子:

    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.
    

    期待一个更新,因为我现在要测试它,并试图解决任何问题,我的电池即将死亡,所以我张贴这个现在未经测试。

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