Предыдущая часть.
Теперь, когда вы изучили основы системы шаблонов 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: загрузка шаблонов.