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

Mat*_*zuk 1 tags django templates rendering

urls.py

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

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>"))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

模板/邮件/ preview.html

<div id="body">{{ message.body|safe }}</div>
Run Code Online (Sandbox Code Playgroud)

但是django templatetags不会被解释,只会呈现为字符串.我想用一个

{% now "Y-m-d" %}
Run Code Online (Sandbox Code Playgroud)

邮件正文中的标记.将来需要使用任何其他标签.

我已经管理了两种工作方法,他们都不满意我.

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

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

你有什么建议吗?

Art*_*urM 7

您必须使用Django模板系统

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())}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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())
Run Code Online (Sandbox Code Playgroud)

并使用:

{{message.body|render}}
Run Code Online (Sandbox Code Playgroud)

  • 最好使用`Template(value)`而不是未记录的`get_template_from_string(value)`.见[这里](http://stackoverflow.com/questions/13383194/what-is-the-difference-between-loader-get-template-from-string-and-creating-a) (2认同)