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)
邮件正文中的标记.将来需要使用任何其他标签.
我已经管理了两种工作方法,他们都不满意我.
我也在考虑创建templatetag,它返回Message.body中的渲染模板.但是我不太确定它是好还是坏.
你有什么建议吗?
您必须使用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)