Использование шаблонов в представлениях Django
Познакомившись с основами использования системы шаблонов, мы теперь применим свои знания к созданию представления. Вспомните представление current_datetime в модуле mysite.views, которое мы написали в предыдущей главе. Вот оно:
from django.http import HttpResponse import datetime
def current_datetime(request): now = datetime.datetime.now()
html = "<html><body>Cen4ac %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>Ceйчac {{ current_date }}.</body></html>") html = t.render(Context({‘current_date’: now})) return HttpResponse(html)
Да, здесь задействована система шаблонов, но проблемы, о которых мы говорили в начале этой главы, так и не решены. Точнее, шаблон все еще встроен в код на Python, так что настоящего отделения данных от внешнего вида мы не добились. Исправим этот недостаток, поместив шаблон в отдельный файл, который будет загружать функция представления.
Первое, что приходит в голову, - сохранить шаблон где-нибудь в файловой системе и воспользоваться имеющимися в 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()
tt Простой способ считать шаблон из файловой системы. tt ПЛОХО, потому что не обрабатывается случай, когда файл tt отсутствует!
fp = open( ‘/home/djangouser/templates/mytemplate.html’) t = Template(fp.read()) fp.close()
html = t.render(Context({‘current_date’: now})) return HttpResponse(html)
Но такой подход трудно назвать элегантным по нескольким причинам:
• Не обрабатывается случай отсутствия файла, как отмечено в комментарии. Если файл mytemplate.html не существует или недоступен для чтения, то вызов ореп() возбудит исключение IOError.
• Местоположение шаблона зашито в код. Применение такой техники в каждой функции представления означало бы необходимость дублирования местоположения, не говоря уже о том, сколько текста придется набирать!
• Содержит много повторяющегося шаблонного кода. Вы могли бы заняться решением более интересных задач вместо того, чтобы писать обращения к функциям open(), fp.read() nfp.close().
Для решения этих проблем мы воспользуемся механизмами загрузки шаблонов и наследования шаблонов.
Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.