Хостинг Django от «Джино»
Table of contents

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

Вы изучили основы использования шаблонной системы. Теперь давайте используем эти знания для создания представления. Вспомните представление 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() при каждой загрузке шаблона.

Для решения подобных проблем мы будем использовать загрузку шаблонов и каталоги шаблонов, которые описаны в этой главе далее.


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5