我的网络应用包含投放API的横幅。
简化横幅模型:
class Banner(models.Model):
name = models.CharField(max_length=50)
ad_tag = models.TextField()
active = models.BooleanField(default=True)
priority = models.IntegerField(null=True, blank=False)
def __unicode__(self):
return self.name
标题服务API接受一些GET参数,并根据这些参数返回一个Django模板,该模板吐出上面的ad_tag
TextField。 ad_tag
字段是横幅的HTML:
<!-- ... -->
<body>
{{ ad_tag|safe}}
</body>
我的问题:我想用Django模板处理器处理ad_tag
字段的内容,所以我可以使用包含,模板逻辑等。这可能吗?
答案 0 :(得分:1)
我在following snippet by GitHub user mhulse取得了成功。这允许我在我的模板中调用{% allow_tags ad_tag %}
并处理在该字段中找到的任何Django模板标记。
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
# http://www.soyoucode.com/2011/set-variable-django-template
# http://djangosnippets.org/snippets/861/
# http://stackoverflow.com/questions/4183252/what-django-resolve-variable-do-template-variable
# https://docs.djangoproject.com/en/dev/ref/templates/api/
@register.tag
def allow_tags(parser, token):
"""
Example: {% allow_tags page.content %}
"""
try:
# Splitting by None == splitting by spaces:
tag_name, var_name = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError, '%r tag requires arguments' % token.contents.split()[0]
return RenderNode(var_name)
allow_tags.is_safe = True
class RenderNode(template.Node):
def __init__(self, content):
self.content = content
def render(self, context):
try:
content = template.Variable(self.content).resolve(context)
return template.Template(content).render(template.Context(context, autoescape=False))
except template.TemplateSyntaxError, e:
return mark_safe('Template error: There is an error one of this page\'s template tags: <code>%s</code>' % e.message)