/ / Existuje v Django jednoduchý spôsob, ako vykresliť textové pole ako šablónu v šablóne? - django, šablóny, filter, štítky

Existuje v Django jednoduchý spôsob vykreslenia textového poľa ako šablóny, do šablóny? - django, šablóny, filter, značky

Napadá vás jednoduchý spôsob, ako vyhodnotiť textové pole ako šablónu počas jej vykresľovania.

Viem, ako to urobiť v zobrazení, ale hľadám filter alebo značku šablóny?

Niečo ako:

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

s object.textfield obsahujúcim niečo ako:

a text with a {% TemplateTag %}.

V ktorom TemplateTag sa vyhodnotí vďaka evaluate filter.

odpovede:

11 pre odpoveď č. 1

Tu je prvá implementácia značky, ktorá vyrieši moju otázku:

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 pre odpoveď č. 2

Bude to zahŕňať regulárne výrazy. Niečo, v čom nie som tak dobrý, som napísal príklad, ale vy (alebo niekto iný tu) budete mať (zaručujem) efektívnejší spôsob, ako to dosiahnuť. Je to však iba príklad:

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)

Toto som ešte netestoval, takže to nemusí fungovať rovno, ale teoreticky môžete spustiť:

{% template_eval object.textfield %}

A vrátilo by sa to:

a text with a VALUE_OF_TEMPLATETAG.

Očakávam jeho aktualizáciu, pretože to teraz otestujem a pokúsim sa vyriešiť akékoľvek problémy, moja batéria má skoro zomrieť, takže zverejňujem tento test teraz.

Očakávajte tiež oveľa šikovnejšie riešenie od niekoho, kto je v Pythone lepší ako ja: str.

EDIT: Dobre, bol som príliš pomalý, porazil si ma!