2009-08-14 7 views
3

テンプレートレンダリング中にテキストフィールドをテンプレートとして評価する簡単な方法について考えることはできますか?Djangoでは、テンプレートとしてテキストフィールドを簡単にレンダリングする方法はありますか?

私はビューでそれを行う方法を知っていますが、私はテンプレートまたはフィルタまたはタグを探していますか?

ような何か:TemplateTagは、evaluateフィルタのおかげで評価されるで

a text with a {% TemplateTag %}.

:のようなものを含むobject.textfieldと

{{ object.textfield|evaluate}} または {% evaluate object.textfield %}

。ここで

答えて

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。

編集:OK、私は遅すぎました、あなたは私を打つ!

+0

お返事ありがとうございます。迅速に対応して申し訳ありません;-) –

関連する問題