【问题标题】:Django template render from db and interprets tagsDjango 模板从 db 渲染并解释标签
【发布时间】:2011-12-01 11:19:24
【问题描述】:

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

template/mailing/preview.html

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

然而 django 模板标签不被解释,只呈现为字符串。 我想用一个

{% now "Y-m-d" %}

消息正文中的标记。将来需要使用任何其他标签。

我已经管理了两种工作方法,它们都不能让我满意。

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

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

你有什么建议吗?

【问题讨论】:

    标签: django templates tags rendering


    【解决方案1】:

    你必须使用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}}
    

    【讨论】:

    • 我在之前的项目中做的完全一样。我希望有一种更优雅的方式来做到这一点。还是谢谢你!
    • 我喜欢templatetag版本!
    • 最好使用Template(value) 而不是未记录的get_template_from_string(value)。见here
    猜你喜欢
    • 1970-01-01
    • 2012-02-29
    • 2010-12-15
    • 2015-09-21
    • 2018-09-29
    • 1970-01-01
    • 2022-07-22
    • 2019-07-30
    • 2021-02-26
    相关资源
    最近更新 更多