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




