Question

J'utilise les modèles Google App Engine et Django.
J'ai un tableau dans lequel je souhaite afficher les objets qui ressemblent à ceci :

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

Le modèle Django est :

<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>

Maintenant le Documentation Django déclare que lorsqu'il voit un . en variables
Il essaie plusieurs choses pour obtenir les données, dont la recherche dans un dictionnaire, ce qui est exactement ce que je veux mais ne semble pas se produire...

Était-ce utile?

La solution

J'ai trouvé une solution "plus agréable" / "meilleure" pour obtenir des variables à l'intérieur, ce n'est pas le plus beau moyen, mais cela fonctionne.

Vous installez un filtre personnalisé dans Django qui obtient la clé de votre dict en tant que paramètre

Pour le faire fonctionner dans Google App-Engine, vous devez ajouter un fichier à votre répertoire principal, j'ai appelé le mien django_hack.py qui contient ce petit bout de code

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)

Maintenant que nous avons ce fichier, il ne nous reste plus qu'à dire au moteur de l'application de l'utiliser...nous faisons cela en ajoutant cette petite ligne à votre fichier principal

webapp.template.register_template_library('django_hack')

et dans votre vue modèle, ajoutez ce modèle au lieu du code habituel

{{ user|hash:item }}

Et ça devrait fonctionner parfaitement =)

Autres conseils

Je suppose que la partie qui ne fonctionne pas est {{ user.item }}.

Django va tenter une recherche dans un dictionnaire, mais en utilisant la chaîne "item" et non la valeur du item variable de boucle.Django a fait la même chose une fois résolu {{ user.name }} au name attribut du user objet, plutôt que de chercher une variable appelée name.

Je pense que vous devrez effectuer un prétraitement des données selon vous avant de les afficher dans votre modèle.

Ou vous pouvez utiliser le système Django par défaut qui est utilisé pour résoudre les attributs dans les modèles comme celui-ci :

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

Cela fonctionne juste

dans ton modèle :

{{ user|hash:item }}

@Dave Webb (je n'ai pas encore été suffisamment bien noté pour commenter)

Les recherches de points peuvent être résumées comme ceci :lorsque le système de modèles rencontre un point dans un nom de variable, il tente les recherches suivantes, dans cet ordre :

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

Le système utilise le premier type de recherche qui fonctionne.C’est une logique de court-circuit.

En remplacement de k, v dans user.items sur Google App Engine en utilisant des modèles Django où user = {'a':1, 'b', 2, 'c', 3}

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

un 1
b2
c3

pair = (clé, valeur) pour chaque élément du dictionnaire.

ça ne devrait pas être ça :

{{ user.item }}

être ça ?

{{ item }}

il n'y a pas d'objet utilisateur dans le contexte de cette boucle.... ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top