2010-03-07 4 views
0

J'essaye de créer un modèle qui mettra des articles dans une table.Django: utiliser les variables comme indices de tableau?

Controller:

items = Item.all().order('name').fetch(10) 

    template_values = {'items': items, 
         'headers': ['Name', 'Price', 'Quantity']} 
    render('Views/table.html', self, template_values) 

Modèle:

<table> 
    <tr> 
    {% for header in headers %} 
     <th>{{header}}</th> 
    {% endfor %} 
    </tr> 
    {% for item in items %} 
     <tr><td><a href="detail/{{item.CSIN}}">{{item.name}}</a></td><td>{{item.CSIN}}</td></tr> 
    {% endfor %} 
</table> 

En ce moment, le modèle est codé en dur pour rechercher certains attributs de item. Je veux changer ceci afin qu'il recherche les attributs avec les noms qui sont dans headers, ou alors qu'il cherche les n premiers attributs, où n est la longueur de headers.

Comment est-ce que je peux faire ceci?

+2

Hmm, pourquoi voudriez-vous mettre la logique du modèle (quelles colonnes afficher) dans la vue? –

+0

Il choisit les colonnes à afficher en fonction de ce que der' est. Cela permet au modèle d'être réutilisé. Le choix des colonnes à afficher est effectué dans le contrôleur, qui indique le modèle via la valeur 'header'. –

Répondre

2

Vous pouvez modifier la vue de le faire:

items = Item.all().order('name').fetch(10) 
headers = ['Name', 'Price', 'Quantity'] 
viewitems = [[getattr(x, h) for h in headers] for x in items] 

template_values = {'items': viewitems, 
        'headers': headers} 
render('Views/table.html', self, template_values) 

donc tout le modèle doit faire est de boucle sur chaque « élément » (qui sera juste une liste des valeurs à afficher correspondant aux en-têtes. Fondamentalement, cela déplacerait la logique (décider quoi montrer) du modèle (ou en fait diviser un peu chacun dans le modèle et la vue) entièrement au code Python dans la vue, simplifiant le modèle et le rendant plus général, comme vous le désirez.

+0

Vous pourriez faire évaluer les articles paresseusement, car ils sont peut-être des requêtes db? –

+0

Oui, je suis sûr que vous pourriez - utiliser un genexp (parenthèses rondes) plutôt qu'un listcomp (crochets) pour le niveau externe de 'viewitems'. Mais avec le 'fetch (10' (c'était déjà dans la question de l'OP), les gains de temps devraient être modestes (si présents: 10 requêtes DB vs une seule requête de 10 items ...). –

1

Je ne suis pas sûr s'il existe un modèle de balise/filtre qui va accomplir ce que vous voulez. Vous pouvez vous intéresser à l'écriture d'une balise ou d'un filtre de modèle personnalisé qui accepte la liste des éléments et l'en-tête actuel et renvoie la valeur après la recherche. Jetez un oeil à http://docs.djangoproject.com/en/dev/howto/custom-template-tags/.

Questions connexes