2011-10-05 26 views
1

urls.pyDjango的模板從數據庫渲染和解釋標籤

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文本字段將整個模板源(insted的文件),並從它呈現一個頁面(模板)。

我也想創建templatetag它返回一個模板呈現出來的Message.body。但我不太確定這是好還是不好。

你有什麼建議嗎?

回答

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}} 
+0

我做了完全一樣的我ñ我以前的項目。我希望有一個更優雅的方式來做到這一點。不管怎樣,謝謝你! –

+0

我喜歡templatetag版本! –

+2

最好使用'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) – MrKsn