【问题标题】:In Django, is there an easy way to render a text field as a template, in a template?在 Django 中,是否有一种简单的方法可以在模板中将文本字段呈现为模板?
【发布时间】:2010-11-19 16:00:22
【问题描述】:

您能想出一种简单的方法来在模板呈现期间将文本字段评估为模板吗?

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

类似:

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

object.textfield 包含以下内容:

a text with a {% TemplateTag %}.

感谢evaluate 过滤器,将在其中评估TemplateTag

【问题讨论】:

    标签: django templates filter tags


    【解决方案1】:

    这是解决我的问题的第一个标签实现:

    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】:

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

      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。

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

      【讨论】:

      • 感谢您的回复!抱歉回复得更快;-)
      猜你喜欢
      • 1970-01-01
      • 2011-12-30
      • 2016-12-04
      • 2019-02-23
      • 2016-12-06
      • 1970-01-01
      • 2015-01-02
      • 2020-02-05
      • 2011-02-15
      相关资源
      最近更新 更多