2015-10-18 2 views
0

Je veux faire quelque chose d'anodin dans un modèle django mais difficile à comprendre. Supposons que j'ai une liste field_list = ['a', 'b', 'c'] et un conteneur nommé report_item. Dans un modèle que je veux faire essentiellement ceci:Comment créer une référence dynamique de conteneur de modèles django

{% for fld_name in field_list %} 
    <td>{{ report_item.{{fld_name}} }}</td> 
{% endfor %} 

J'ai vérifié la report_item.a, .B, .c sont accessibles (même si elles ne sont pas que cela devrait être ok). J'ai essayé toutes les combinaisons possibles de citer, etc. et recherche sur le web solutions, lisez les docs N fois continuer encore obtenir cette erreur:

Could not parse the remainder: '{{fld_name' from 'field_list.{{fld_name' 

Votre aide est grandement appréciée.

EDIT , on m'a demandé ci-dessous comment je construis mon ITEMS_LIST:

context[ "items_list" ] = MyModel.objects.filter(...) 

et j'ai:

context[ "field_list" ] = [ 
     [ "Date Placed",    "date_placed" ], 
     ... 
    ] 

et dans le modèle je:

{% for report_item in items_list %} 
    {% for fld_hdr, fld_name in field_list %} 
     {{ report_item.{{fld_name}} }} 
    {% endfor %} 
{% endfor %} 

Comme je l'ai déjà dit, si je le fais:

{{ report_item.date_placed }} 

cela fonctionne très bien.

+1

Vous aurez besoin d'un filtre de modèle personnalisé pour cela. –

+0

exemple? Je ne vois pas comment un filtre pourrait aider à résoudre ce problème. – staggart

Répondre

1

Vous souhaitez obtenir dynamiquement un attribut à partir d'un objet. Pour cela en Python, vous utilisez getattr, et la façon de le faire dans un template Python est d'écrire un filtre qui appelle getattr sur son argument.

@register.filter 
def get_field(obj, arg): 
    return getattr(obj, arg) 

Maintenant vous pouvez faire {{ report_item|get_field:fld_name }}

+0

Oui, c'est ce dont j'avais besoin et ça marche super Pour les points bonus, comment ça se passe {{x. {{y}}}} ça ne marche pas? quand la prime est disponible, en supposant que quelqu'un trouve une solution sans filtre – staggart

+0

mon malentendu sur quand je pourrais accepter la réponse (confus par des trucs de "prime".) Merci. – staggart

1

Essayez simplement {{report_item.fld_name}}. J'espère que cela t'aides.

+0

Aucune joie, {{report_item.fld_name}} est rendu comme "" (ie, chaîne vide, comme prévu – staggart

+0

Pourriez-vous me montrer comment vous définissez report_item? –

+0

désolé, le commentaire ci-dessus soumis accidentellement - voir mon ajouté EDIT à mon poste principal pour savoir comment je construis report_item – staggart