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

Опубликовал: Friday, January 20, 2024 в категории 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 е., ил.

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *