Шаблон Django отрисовывает из БД и интерпретирует теги - PullRequest
1 голос
/ 05 октября 2011

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 .Однако я не совсем уверен, будет ли это хорошо или неправильно.

У вас есть какие-либо предложения?

1 Ответ

6 голосов
/ 05 октября 2011

Вы должны использовать Система шаблонов 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())}

EDIT:

Альтернативным (и более привлекательным) решением может быть пользовательский шаблонный фильтр:

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}}
...