Шаблоны Django и переменные атрибуты

Я использую шаблоны 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 говорится, что когда он видит . в переменных
Он пытается несколько вещей, чтобы получить данные, одна из которых - поиск по словарю, что именно то, что я хочу, но, похоже, не происходит ...


person Yon    schedule 30.08.2008    source источник
comment
Это элегантное решение: stackoverflow.com/a/8000091/781695   -  person user    schedule 11.04.2014


Ответы (6)


Я нашел "более приятное" / "лучшее" решение для размещения переменных внутри. Это не самый лучший способ, но он работает.

Вы устанавливаете собственный фильтр в django, который получает ключ вашего dict в качестве параметра

Чтобы он работал в движке приложений Google, вам нужно добавить файл в свой основной каталог, я назвал свой 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 }}

И он должен работать отлично =)

person Yon    schedule 08.09.2008

Я предполагаю, что часть, которая не работает, {{ user.item }}.

Django попытается выполнить поиск по словарю, но будет использовать строку "item", а не значение переменной цикла item. Django сделал то же самое, когда преобразовал {{ user.name }} в атрибут name объекта user, вместо того, чтобы искать переменную с именем name.

Я думаю, вам нужно будет выполнить некоторую предварительную обработку данных в вашем представлении, прежде чем вы визуализируете их в своем шаблоне.

person Dave Webb    schedule 30.08.2008

Или вы можете использовать систему django по умолчанию, которая используется для разрешения атрибутов в tempaltes, например:

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 }}
person Martyn    schedule 12.08.2010
comment
Я мог бы поцеловать тебя - person Comm4nd0; 11.06.2020

@ Дэйв Уэбб (я еще не получил достаточно высокого рейтинга, чтобы комментировать)

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

* 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])

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

person Brandon Henry    schedule 14.08.2009

В качестве замены 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
b 2
c 3

пара = (ключ, значение) для каждого элемента словаря.

person Niall Farrington    schedule 27.06.2010

не должно этого:

{{ user.item }}

быть этим?

{{ item }}

в этом цикле нет пользовательского объекта в контексте ....?

person Nic Wise    schedule 31.08.2008