|
Table of contents
|
Давайте рассмотрим шаблонную систему 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'
|
Found misprint?
Select it with the mouse and hit 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 |
Мда, к сожалению эта важная глава самая непоследовательная, сложная и запутанная из прочтенных... ИМХО, весь материал по методам и точечной нотации так и просится в отдельную главу, скажем, в изложении перед 4й главой. (Претензии понятно не к переводу, а к ув. Автору книги.:))