34 votes

Modèles Django et attributs variables

Je suis en utilisant Google App Engine et Modèles Django.
J'ai un tableau que je veux afficher les objets ressembler à quelque chose comme:

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

Le django template 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 django manuel stipule que, lorsqu'il en voit un . dans des variables
il tente plusieurs choses pour obtenir les données, dont l'un est à la recherche dans le dictionnaire ce qui est exactement ce que je veux, mais ne semble pas se produire...

32voto

Yon Points 804

J'ai trouvé un "plus agréable"/"meilleure" solution pour obtenir des variables à l'intérieur d' Ce n'est pas la plus belle façon, mais il fonctionne.

Vous installez un filtre personnalisé dans django qui reçoit 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 morceau 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, tout ce que nous devons faire est d'indiquer à l'application-moteur à l'utiliser... nous faisons cela en ajoutant cette petite ligne à votre fichier principal

webapp.template.register_template_library('django_hack')

et dans votre template de vue ajouter ce modèle au lieu de l'habituel code

{{ user|hash:item }}

Et sa devrait fonctionner parfaitement =)

10voto

Dave Webb Points 90034

Je suis en supposant que la partie ne fonctionne pas est - {{ user.item }}.

Django sera d'essayer une recherche dans le dictionnaire, mais en utilisant la chaîne de caractères "item" et pas de la valeur de l' item variable de boucle. Django fait la même chose quand il est résolu {{ user.name }} de la name attribut de l' user de l'objet, plutôt que sur la recherche d'une variable nommée name.

Je pense que vous aurez besoin de faire quelques prétraitement des données dans votre vue avant de vous rendre dans votre modèle.

8voto

Martyn Points 51

Ou vous pouvez utiliser le système django par défaut qui est utilisé pour résoudre les attributs en tempaltes comme ceci:

 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
 

Ça marche

dans votre modèle:

 {{ user|hash:item }}
 

4voto

Brandon H Points 2063

@Dave Webb (je n'ai pas encore été évalué assez haut pour commenter)

Les recherches de points peuvent être résumées comme suit: lorsque le système de modèles rencontre un point dans un nom de variable, il essaie 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.

2voto

hollerith Points 19

En remplacement de k, v dans user.items sur Google App Engine à l'aide de 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
b 2
c 3

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X