Почему язык шаблонов Django не позволяет что-то вроде [0] [1]? - PullRequest
1 голос
/ 08 марта 2012

Когда я пытался получить доступ к кортежу внутри списка в формате шаблона Django, я обнаружил, что не могу получить к нему доступ с помощью a[ 0 ][ 1 ], вместо этого мне пришлось использовать a.0.1.

Предположим, что a это что-то вроде

a = [
    ( 'a', 'apple' ),
    ( 'b', 'bee'   ),
]

Почему язык шаблонов Django не поддерживает a[ 0 ][ 1 ]? В обычном программировании на Python a.0.1 выдаст синтаксическую ошибку.

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

Документы Django по API шаблона объясняют это красиво:

Точки имеют особое значение при визуализации шаблона.Точка в имени переменной означает поиск.В частности, когда система шаблонов встречает точку в имени переменной, она пытается выполнить следующий поиск в следующем порядке:

  • Поиск в словаре.Пример: foo["bar"]
  • Поиск атрибутов.Пример: foo.bar
  • Поиск по индексу списка.Пример: foo[bar]

Система шаблонов использует первый тип поиска, который работает.Это логика короткого замыкания.Вот несколько примеров:

>>> from django.template import Context, Template
>>> t = Template("My name is {{ person.first_name }}.")
>>> d = {"person": {"first_name": "Joe", "last_name": "Johnson"}}
>>> t.render(Context(d))
"My name is Joe."

>>> class PersonClass: pass
>>> p = PersonClass()
>>> p.first_name = "Ron"
>>> p.last_name = "Nasty"
>>> t.render(Context({"person": p}))
"My name is Ron."

>>> t = Template("The first stooge in the list is {{ stooges.0 }}.")
>>> c = Context({"stooges": ["Larry", "Curly", "Moe"]})
>>> t.render(c)
"The first stooge in the list is Larry."

Variable._resolve_lookup в django.templates.base , кажется, является функцией, отвечающей за это, и не сильно изменилась начиная с самой старой ревизии, которую я могу найти

3 голосов
/ 08 марта 2012

Вы можете найти некоторую информацию об этом в книге Джанго :

В начале главы должно быть объяснено, почему это работает следующим образом: в предыдущей главе вы можетезаметили нечто особенное в том, как мы возвращали текст в наших примерах.А именно, HTML был жестко закодирован непосредственно в нашем коде Python, например:

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

Хотя этот метод был удобен для объяснения работы представлений, он не очень хорошИдея жестко закодировать HTML прямо в ваших взглядах.Вот почему:

  • Любое изменение дизайна страницы требует изменения кода Python.Дизайн сайта имеет тенденцию меняться гораздо чаще, чем основной код Python, поэтому было бы удобно, если бы дизайн мог измениться без необходимости изменения кода Python.
  • Написание кода Python и проектирование HTML - это два разныхдисциплины и большинство профессиональных сред веб-разработки разделяют эти обязанности между отдельными людьми (или даже отдельными отделами).Дизайнеры и HTML / CSS-кодеры не должны редактировать код Python для выполнения своей работы.
  • Это наиболее эффективно, если программисты могут работать над кодом Python, а дизайнеры могут работать над шаблонами одновременно, а неодин человек ждет, пока другой закончит редактирование одного файла, который содержит как Python, так и HTML.

По этим причинам гораздо понятнее и удобнее отделить дизайн страницы от самого кода Python.,Мы можем сделать это с помощью системы шаблонов Django, которую мы обсудим в этой главе.

...

Поиск точек можно обобщить так: когда система шаблонов встречает точку в имени переменной, он пытается выполнить следующий поиск в следующем порядке:

  • Поиск по словарю (например, foo ["bar"])
  • Поиск по атрибутам (например, foo.bar) 1
  • Вызов метода (например, foo.bar ())
  • Поиск по индексу списка (например, foo [2])

Система использует первый тип поиска, которыйработает.Это логика короткого замыкания.

2 голосов
/ 08 марта 2012

Причина, по которой я бы сказал, что язык шаблонов django не делает XYZ-способ доступа к контекстным данным, заключается в том, что обычно в этот момент вы делаете слишком много на стороне шаблона по сравнению с представлением, которое его отображает.

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

У вас также есть возможность создавать свои собственные фильтры шаблонов для более настраиваемой обработки данных.

В зависимости от вашего вопроса, доступ к дочерним элементам с использованием точечной нотации - это шаблонный шаблон django, позволяющий попробовать несколько подходов к разрешению элемента.Он пытается ключи словаря, атрибуты и т. Д. В определенном порядке.Вы просто используете точечную запись для всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...