Django模板从db渲染并解释标签

时间:2011-10-05 12:51:13

标签: django templates tags rendering

urls.py

url(r'^/mailing/(?P<pk>\d+)/preview/$', PreView.as_view(), name="preview"),

models.py

class Message(models.Model):
    # ... other fields ...
    body = models.TextField(_("Body"), help_text=_("You can use Django <a target='_blank' href='https://docs.djangoproject.com/en/dev/ref/templates/builtins/'>template tags</a>"))

views.py

class PreView(TemplateView):
    template_name = "mailing/preview.html"

    def get_context_data(self, pk, **kwargs):
        try:
            return {"message": Message.objects.get(id=pk)}
        except Message.DoestNotExist:
            raise Http404

模板/邮寄/ preview.html

<div id="body">{{ message.body|safe }}</div>

然而,django templatetags不会被解释,只会呈现为字符串。 我想用

{% now "Y-m-d" %}
邮件正文中的

标记。将来需要使用任何其他标签。

我管理了两种工作方法,但都不满足我。

  • 使用正则表达式和替换,
  • 将整个模板源放入db TextField(insted of file),并从中呈现页面(模板)。

我也在考虑创建templatetag,它返回 Message.body 中的渲染模板。但是我不太确定它是好是坏。

你有什么建议吗?

1 个答案:

答案 0 :(得分:6)

您必须使用Django template system

from django.template.loader import get_template_from_string
from django.template.context import Context

return {"message": message, "body": get_template_from_string(message.body).render(Context())}

编辑:

替代(和更漂亮)解决方案可以是自定义模板过滤器:

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def render(value):
    return get_template_from_string(value).render(Context())

并使用:

{{message.body|render}}