Шаблоны Django и переменные атрибуты
-
09-06-2019 - |
Вопрос
Я использую Google App Engine и шаблоны Django.
У меня есть таблица, в которой я хочу, чтобы объекты выглядели примерно так:
Object Result:
Items = [item1,item2]
Users = [{name='username',item1=3,item2=4},..]
Шаблон Django:
<table>
<tr align="center">
<th>user</th>
{% for item in result.items %}
<th>{{item}}</th>
{% endfor %}
</tr>
{% for user in result.users %}
<tr align="center">
<td>{{user.name}}</td>
{% for item in result.items %}
<td>{{ user.item }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
Теперь Документация Django заявляет, что при обнаружении . в переменных
Он пытается получить данные несколькими способами, одним из которых является поиск по словарю, что именно то, что я хочу, но, похоже, не происходит ...
Решение
Я обнаружил, что "лучше" / "лучше" решение для получения переменных внутри Это не самый лучший способ, но он работает.
Вы устанавливаете пользовательский фильтр в django, который получает ключ вашего dict в качестве параметра
Чтобы он работал в google app-engine, вам нужно добавить файл в основной каталог, Я назвал мой django_hack.py , который содержит этот маленький кусочек кода
from google.appengine.ext import webapp
register = webapp.template.create_template_register()
def hash(h,key):
if key in h:
return h[key]
else:
return None
register.filter(hash)
Теперь, когда у нас есть этот файл, все, что нам нужно сделать, - указать движку приложения использовать его ... мы делаем это, добавляя эту маленькую строчку в ваш основной файл
webapp.template.register_template_library('django_hack')
и в представлении шаблона добавьте этот шаблон вместо обычного кода
{{ user|hash:item }}
И это должно прекрасно работать =)
Другие советы
Я предполагаю, что часть, которая не работает, является {{user.item}}
.
Django будет пытаться выполнить поиск в словаре, но будет использовать строку " item "
, а не значение переменной цикла item
. Django сделал то же самое, когда разрешил {{user.name}}
в атрибуте name
объекта user
, вместо того, чтобы искать переменная с именем name
.
Я думаю, вам нужно будет выполнить некоторую предварительную обработку данных в вашем представлении, прежде чем вы представите их в своем шаблоне.
Или вы можете использовать систему django по умолчанию, которая используется для разрешения атрибутов в шаблонах следующим образом:
from django.template import Variable, VariableDoesNotExist
@register.filter
def hash(object, attr):
pseudo_context = { 'object' : object }
try:
value = Variable('object.%s' % attr).resolve(pseudo_context)
except VariableDoesNotExist:
value = None
return value
Это просто работает
в вашем шаблоне:
{{ user|hash:item }}
@Dave Webb (меня еще не оценили достаточно высоко, чтобы комментировать)
Поиск точек можно суммировать следующим образом: когда система шаблонов встречает точку в имени переменной, она пытается выполнить следующий поиск в следующем порядке:
* Dictionary lookup (e.e., foo["bar"])
* Attribute lookup (e.g., foo.bar)
* Method call (e.g., foo.bar())
* List-index lookup (e.g., foo[bar])
Система использует первый тип поиска, который работает. Это логика короткого замыкания.
В качестве замены k, v в user.items в Google App Engine с использованием шаблонов django, где user = {'a': 1, 'b', 2, 'c', 3}
{% for pair in user.items %}
{% for keyval in pair %} {{ keyval }}{% endfor %}<br>
{% endfor %}
a 1
б 2
с 3
pair = (ключ, значение) для каждого элемента словаря.
не должно это:
{{ user.item }}
быть этим?
{{ item }}
в этом цикле нет пользовательского объекта в контексте ....?