|
Оглавление
|
Давайте рассмотрим шаблонную систему Django подробнее, вы сможете увидеть как она работает, но пока мы не будем интегрировать её с представлениями, которые мы создали в прошлой главе. Наша цель в данный момент — показать вам как шаблонная система работает независимо от остальной части Django. (Предположим другой способ: обычно вы будете использовать шаблонную систему совместно с представлениями, но мы желаем показать то, что шаблонная система является обычной библиотекой Python, которую вы можете использовать где угодно, не только с представлениями Django.) Ниже указан самый основной способ использования шаблонной системы Django в коде Python:
Пример использования: >>> from django import template
>>> t = template.Template('My name is {{ name }}.')
>>> c = template.Context({'name': 'Adrian'})
>>> print t.render(c)
My name is Adrian.
>>> c = template.Context({'name': 'Fred'})
>>> print t.render(c)
My name is Fred.
Следующие разделы описывают каждый шаг более детально.
Простейшим способом создания объекта
В каталоге проекта mysite, созданном с помощью команды django-admin.py startproject (это было описано в главе «Начинаем»), выполните команды python manage.py shell для запуска интерактивного интерпретатора.
Пример интерактивной интерпретацииЕсли вы использовали Python ранее, вас может заинтересовать, почему мы используем python manage.py shell, а не просто python. Обе команды запускают интерпретатор, но наш вариант имеет одну ключевую особенность: перед запуском интерпретатора, он указывает Django какой файл конфигурации следует использовать. Многие компоненты Django, включая шаблонную систему, зависят от ваших настроек и вы не сможете их использовать до тех пор, пока среда разработки не будет знать где их брать.
Если вам это интересно, расскажем как всё это работает
внутри. Django ищет переменную среды с именем
При запуске python manage.py shell
настройка
После того, как вы лучше изучите Django, вероятно вы
перестанете использовать данный способ и будете
устанавливать
Рассмотрим основы шаблонной системы: >>> from django.template import Template
>>> t = Template('My name is {{ name }}.')
>>> print t
Если вы попробовали запустить данный код в интерпретаторе, то вы увидели нечто подобное: <django.template.Template object at 0xb7d5f24c>
Шестнадцатеричный адрес объекта —
0xb7d5f24c будет всякий раз разным, не
обращайте на это внимание. Это внутренняя информация Python,
так называемый «идентификатор» созданного объекта
При создании объекта >>> from django.template import Template
>>> t = Template('{% notatag %}')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
...
django.template.TemplateSyntaxError: Invalid block tag: 'notatag'
Термин «block tag[7]» в данном случае относится к {% notatag %}. «Блочный тег» и «шаблонный тег» являются синонимами.
Система вызывает исключение
После того, как объект
Контекст в Django представлен классом
>>> from django.template import Context, Template
>>> t = Template('My name is {{ name }}.')
>>> c = Context({'name': 'Stephane'})
>>> t.render(c)
u'My name is Stephane.'
Единственное, о чём следует упомянуть — то, что значение
t.render(c) является объектом
Словари и контексты
Словарь в языке Python является отображением между
известным набором ключей и их
значений.
Имена переменных должны начинаться с буквы (A-Z или a-z) и могут состоять из множества букв, цифр, символов подчёркивания и точек. (Точки являются особым случаем, мы скоро рассмотрим их.) Имена переменных регистрозависимы. Ниже показан пример компиляции и обработки шаблона, который похож на тот, что мы рассмотрели в начале главы: >>> from django.template import Template, Context
>>> raw_template = """<p>Dear {{ person_name }},</p>
...
... <p>Thanks for placing an order from {{ company }}. It's scheduled to
... ship on {{ ship_date|date:"F j, Y" }}.</p>
...
... {% if ordered_warranty %}
... <p>Your warranty information will be included in the packaging.</p>
... {% else %}
... <p>You didn't order a warranty, so you're on your own when
... the products inevitably stop working.</p>
... {% endif %}
...
... <p>Sincerely,<br />{{ company }}</p>"""
>>> t = Template(raw_template)
>>> import datetime
>>> c = Context({'person_name': 'John Smith',
... 'company': 'Outdoor Equipment',
... 'ship_date': datetime.date(2009, 4, 2),
... 'ordered_warranty': False})
>>> t.render(c)
u"<p>Dear John Smith,</p>\n\n<p>Thanks for placing an order from Outdoor
Equipment. It's scheduled to\nship on April 2, 2009.</p>\n\n\n<p>You
didn't order a warranty, so you're on your own when\nthe products
inevitably stop working.</p>\n\n\n<p>Sincerely,<br />Outdoor Equipment
</p>"
Рассмотрим каждую строку кода:
Таковы основы использования шаблонной системы Django: просто
напишите шаблонную строку, создайте объект
После того, как вы создали объект
# Так делать не стоит
for name in ('John', 'Julie', 'Pat'):
t = Template('Hello, {{ name }}')
print t.render(Context({'name': name}))
# Правильный подход
t = Template('Hello, {{ name }}')
for name in ('John', 'Julie', 'Pat'):
print t.render(Context({'name': name}))
Django обрабатывает шаблон достаточно быстро. Внутри всё это сводится к вызову единственного регулярного выражения. Это сильно контрастирует по отношению к шаблонным движкам, построенных на XML, которые вносят затраты на разбор XML и по скорости проигрывают шаблонной системе Django. В вышеприведённых примерах мы передавали простые значения в контекст, в основном это были строки, иногда даты. Тем не менее, шаблонная система легко обрабатывает более сложные структуры данных, такие как списки, словари и различные объекты. Ключом к такой всеядности является символ . (точка). Используйте точку для получения доступа к ключам словаря, атрибутам, методам и индексам объекта. Это хорошо проиллюстрировано в нескольких примерах. Например, предположим, что вы передали словарь в шаблон. Для получения доступа к значениям этого словаря по ключу следует использовать точку: >>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
u'Sally is 43 years old.'
Аналогично, точка также позволяет получить доступ к атрибутам
объекта. Например, объект >>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
u'The month is 5 and the year is 1993.'
Следующий пример использует класс, демонстрируя методику получения доступа к атрибутам объекта: >>> from django.template import Template, Context
>>> class Person(object):
... def __init__(self, first_name, last_name):
... self.first_name, self.last_name = first_name, last_name
>>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
u'Hello, John Smith.'
С помощью точек можно получать доступ к
методам объектов. Например, каждая строка
Python обладает методами >>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
u'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
u'123 -- 123 -- True'
Следует отметить, что не следует завершать имя метода скобками. Также нет никакой возможности передать аргументы в методы, вы можете использовать только те методы, которые не требуют аргументов. (Мы объясним такой подход немного позже в этой главе.) Наконец, точки используюся для доступа к элементам списка по индексу, например: >>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
u'Item 2 is carrots.'
Отрицательные значения индекса не допускаются. Например,
шаблонная переменная {{ items.-1 }} вызовет
исключение Списки в PythonЗапомните: индексирование элементов списка в Python начинается с нуля. Первый элемент имеет индекс 0, второй — 1 и так далее.
Использование «точечного» синтаксиса можно описать так, когда шаблонная система обнаруживает точку в имени переменной, она пытается выполнить следующие действия в указанном порядке:
Система использует первое, что сработает.
«Точечный» поиск может быть
многоуровневым. Например, в следующем примере используется
переменная {{ person.name.upper }}, которая
преобразовывается в поиск по словарю
(person['name']) и затем вызывается метод
( >>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name.upper }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
u'SALLY is 43 years old.'
Вызовы методов являются более сложным процессом, чем другие типы «точечного» поиска. Ниже представлены вещи, о которых рекомендуется помнить:
По умолчанию, если переменная не существует, шаблонная система отобразит такую переменную как пустую строку. Например: >>> from django.template import Template, Context
>>> t = Template('Your name is {{ name }}.')
>>> t.render(Context())
u'Your name is .'
>>> t.render(Context({'var': 'hello'}))
u'Your name is .'
>>> t.render(Context({'NAME': 'hello'}))
u'Your name is .'
>>> t.render(Context({'Name': 'hello'}))
u'Your name is .'
Система просто игнорирует такие шаблонные переменные, не вызывая исключение, потому что она должна быть устойчивой к человеческим ошибкам. В данном случае все «точечные» проверки будут неудачными. В случае настоящего приложения недопустимо, чтобы web-сайт стал недоступным из-за маленькой ошибки в шаблоне.
Большую часть времени, вы будете создавать объекты
>>> from django.template import Context
>>> c = Context({"foo": "bar"})
>>> c['foo']
'bar'
>>> del c['foo']
>>> c['foo']
Traceback (most recent call last):
...
KeyError: 'foo'
>>> c['newvariable'] = 'hello'
>>> c['newvariable']
'hello'
|
Увидели ошибку?
Выделите её мышкой и нажмите
-
Обработано:
510
49
130
71
Версия книги
1.0
2.0
Версия 2.0 в процессе перевода!
Мой луч
Многообразие света
Полезное
Актуальные вакансии,
Python работа
для python-разработчиков.
Скачать в формате
CHM от 2 сентябряЗаказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта. Чем чаще заказываете — тем больше перевожу. Русская группа
Ускорить процесс перевода!
R130494980980
Z425285133788 E112528079659 U327380922061 Книга помогла реализовать:
|
| © 2008-2009 Ruslan Popov @ gmail.com | Powered by Django 1.1 beta 1 SVN-11114 |