Django Book: использование шаблонов в представлениях

Автор: | 16/02/2015
 

django_logo_2Предыдущая часть.

Теперь, когда вы изучили основы системы шаблонов Django, давайте разберёмся как создавать представления с использованием шаблонов.

Вспомните представление current_datetime, которое мы создали в предыдущей главе, в разделе Django Book: третье представление – динамические URL-ы.

Вот как оно выглядит:

from django.http import HttpResponse, Http404
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

Давайте изменим его, что бы использовать шаблон. Первое, что приходит в голову – это сделать что-то вроде такого:

from django.http import HttpResponse, Http404
from django.template import Template, Context
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = Template("<html><body>It is now {{ current_date }}.</body></html>")
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

Конечно, тут используется система шаблонов, но – не решаются проблемы, описанные во введении в эту главу. А именно – шаблон всё ещё вписан непосредственно в код Python, и реальное разделение представления и данных не сделано. Давайте исправим это, поместив шаблон в отдельный файл, который будет загружаться в представление.

Сначала, вы могли бы предложить сохранить шаблон в файле где-то в файловой системе, а потом использовать встроенные возможности Python, что бы его прочитать. Вот как бы это выглядело, если предположить, что шаблон будет сохранён в файл /var/www/django/example/timetemplate.html и содержал бы такой код:

<html><body>It is now {{ current_date }}.</body></html>

А само представление выглядело бы так:

from django.http import HttpResponse, Http404
from django.template import Template, Context
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    #t = Template("<html><body>It is now {{ current_date }}.</body></html>")
    fp = open('/var/www/django/example/timetemplate.html')
    t = Template(fp.read())
    fp.close()
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

Однако, такой подход является не самым лучшим решением, и вот почему:

  • Не проводится проверка наличия файла шаблона. Если файл отсутствует – функция open() вызовет исключение IOError;
  • Расположение файла шаблона жестко вписано в код представления. Если вы будете использовать такой способ для каждой функции – вам придётся повторять один и тот же код много раз;
  • В нём используется много скучного и однотипного кода. Вы можете заняться чем-то поинтереснее, чем писать вызовы функций open(), fp.read() и fp.close() каждый раз, когда требуется загрузить шаблон.

Что бы решить эти неприятности – можно использовать загрузку шаблонов и директории шаблонов.

Продолжение – Django Book: загрузка шаблонов.