modelos de Django e atributos variáveis

votos
32

Estou usando templates Google App Engine e Django.
Eu tenho uma tabela que eu quero exibir os objetos algo como:

Object Result:
    Items = [item1,item2]
    Users = [{name='username',item1=3,item2=4},..]

O modelo de 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>

Agora o documention Django afirma que quando vê um . em variáveis
Ele tenta várias coisas para obter os dados, um dos quais é de pesquisa do dicionário que é exatamente o que eu quero, mas não parece acontecer ...

Publicado 30/08/2008 em 14:20
fonte usuário
Em outras línguas...                            


6 respostas

votos
32

Eu encontrei uma solução "mais agradável" / "melhor" para obter variáveis ​​dentro de sua não é a melhor maneira, mas funciona.

Você instalar um filtro personalizado em Django que recebe a chave do seu dict como parâmetro

Para fazê-lo funcionar no google app-engine você precisa adicionar um arquivo para seu diretório principal, eu chamei o meu django_hack.py que contém este pequeno pedaço de código

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)

Agora que temos esse arquivo, tudo o que precisamos fazer é dizer o app-engine para usá-lo ... fazemos isso adicionando esta pequena linha ao seu arquivo principal

webapp.template.register_template_library('django_hack')

e em sua opinião template adicionar esse modelo em vez do código de costume

{{ user|hash:item }}

E seu deve funcionar perfeitamente =)

Respondeu 08/09/2008 em 20:01
fonte usuário

votos
9

Estou assumindo que a parte o que não funciona é ` user`.`item `.

Django será tentar uma pesquisa no dicionário, mas utilizando a cadeia "item"e não o valor da itemvariável do laço. Django fez a mesma coisa quando se resolveu ` user`.`name `ao nameatributo do userobjeto, em vez de olhar para uma variável chamada name.

Eu acho que você vai precisar fazer alguns pré-processamento dos dados na sua opinião antes de torná-lo no seu modelo.

Respondeu 30/08/2008 em 15:16
fonte usuário

votos
8

Ou você pode usar o sistema de Django padrão, que é usado para resolver atributos em Tempaltes como este:

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

Isso só funciona

em seu modelo:

{{ user|hash:item }}
Respondeu 12/08/2010 em 10:36
fonte usuário

votos
3

@ Dave Webb (i não ter sido classificado como alto o suficiente para comentar até o momento)

As pesquisas de ponto pode ser resumido assim: quando o sistema modelo encontra um ponto em um nome de variável, ele tenta os seguintes pesquisas, nesta ordem:

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

O sistema utiliza o primeiro tipo de pesquisa que funciona. É a lógica de curto-circuito.

Respondeu 14/08/2009 em 16:45
fonte usuário

votos
2

Como um substituto para k, v em user.items no Google App Engine usando modelos Django onde o usuário = { 'a': 1, 'b', 2, 'c', 3}

{% for pair in user.items %}
   {% for keyval in pair %} ` keyval `{% endfor %}<br>
{% endfor %}

um 1
b 2
c 3

par = (chave, valor) para cada item de dicionário.

Respondeu 27/06/2010 em 01:34
fonte usuário

votos
0

não deve:

` user`.`item `

ser isso?

` item `

não há nenhum objeto de usuário no contexto em que ciclo ....?

Respondeu 31/08/2008 em 23:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more