Вы изучили основы использования шаблонной системы. Теперь давайте используем эти знания для создания представления. Вспомните представление current_datetime из модуля mysite.views, с которого мы начали предыдущую главу. Вот как оно выглядит:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
Внесём изменения в это представление, чтобы оно стало использовать шаблонную систему Django. Сначала вы можете подумать о чём-то подобном:
from django.template import Template, Context
from django.http import HttpResponse
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 функциональность для загрузки содержимого
этого шаблона. Ниже показан такой вариант, предполагается, что
шаблон находится в файле
/home/djangouser/templates/mytemplate.html
:
from django.template import Template, Context
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
# Simple way of using templates from the filesystem.
# This doesn't account for missing files!
fp = open('/home/djangouser/templates/mytemplate.html')
t = Template(fp.read())
fp.close()
html = t.render(Context({'current_date': now}))
return HttpResponse(html)
Такой подход, тем не менее, не элегантен по следующим причинам:
Он не обрабатывает случай отсутствия файла. Если файл
/home/djangouser/templates/mytemplate.html
не существует или недоступен для чтения, вызовopen()
приведёт к исключению IOError.Он ищет шаблон по жёстко указанному пути. Если вы используете такой метод для каждой функции представления, вы будете размножать путь до шаблона. Мы даже не говорим, как это надо будет набирать!
Он включает в себя много одинакового кода. Многое можно сделать вместо вызова
open()
,fp.read()
иfp.close()
при каждой загрузке шаблона.
Для решения подобных проблем мы будем использовать загрузку шаблонов и каталоги шаблонов, которые описаны в этой главе далее.
Пред. | Уровень выше | След. |
Философия и ограничения | Начало | Загрузка шаблонов |
0 comments | Make a comment