2009-08-14 144 views
3

您可以考虑一种在模板呈现过程中将文本字段评估为模板的简单方法。在Django中,是否有一种简单的方法在模板中将文本字段呈现为模板?

我知道如何做到这一点的看法,但我在寻找一个模板过滤器或标签?

是这样的:

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

用含有类似object.textfield:

a text with a {% TemplateTag %}.

在哪个TemplateTag将被评估,由于evaluate滤波器。

回答

11

这里是第一代码实施,解决我的问题:

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

这将涉及到正则表达式。我不太擅长的东西,我写了一个例子,但你(或其他人)会(我保证)有一个更有效的方法来做到这一点。但是,这仅仅是一个例子:

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。

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

+0

感谢您的答复!对不起,快速响应;-) – 2009-08-14 15:30:55

相关问题