2013-05-12 3 views
1

que je veux faire dans mon modèle:modèle django: tag modèle personnalisé pour afficher le dictionnaire de dictionnaire

{% for field in form %} 
    {{ realNameDict.field.name }} 
{% endfor %} 

realNameDict est un dictionnaire. Le code ci-dessus ne fonctionne pas. Pourquoi ?

EDIT: En python, je pense que je pourrais le faire:

print realNameDict[field[name]] 

Un grand merci.

SOLUTION:

Merci à l'explication de @Calvin Cheng: L'astuce consiste à utiliser des balises modèle personnalisé.

1/Dans le répertoire de votre application, créez un répertoire appelé templatetags. Créez deux fichiers: __init__.py (laissez-le vide) et extra.py (utilisé pour créer les balises de modèle personnalisé).

2/Dans extra.py, créez la fonction pour obtenir la valeur d'un dictionnaire de dictionnaire:

from django import template 
register = template.Library() 

@register.filter 
def ofKey(value, arg): 
    if value: 
     return value.get(arg) 
    else: 
     return "" 

3/Dans votre modèle, à l'intérieur du bloc de contenu, ajoutez la ligne suivante pour charger la coutume tag modèle:

{% load extra %} 

4/Appelez le tag modèle personnalisé dans votre modèle:

{{ realNameDict|ofKey:field.name }} 

Répondre

2

realNameDict ne sait pas ce que field est. Vous attendez le modèle de la boucle in pour résoudre la valeur du champ dans le dictionnaire, mais realNameDict.field.namefield est en fait littérale.

Solution

L'astuce est d'écrire une étiquette de modèle personnalisé si vous insistez vraiment sur la résolution field dynamiquement. Voici un exemple, une solution à un problème similaire (pas exactement le même) - Django template object property lookup with a dynamic variable name

Dans cette réponse à une autre question (mais très similaire à votre problème), ofKey est une fonction d'étiquette de modèle personnalisé qui résout dynamiquement le [variable] au item.[variable].

Ce qui signifie que vous devriez avoir quelque chose comme ceci: -

{% for field in form %} 
    {{ field|resolve_realNameDict_name }} 
{% endfor %} 

Parce que vous avez la valeur résolue de field dans votre boucle for-in, vous pouvez maintenant utiliser votre fonction tag modèle personnalisé resolve_realNameDict_name (qui vous devez vous écrire bien sûr) pour agir sur le field alors qu'il boucle la boucle for-in et renvoie la valeur name appropriée à partir de votre fonction de balise de modèle personnalisé dans le modèle.

+0

Ok. Alors, comment faire? J'ai édité mon premier post pour expliquer ce que je veux faire. – rom

+1

Merci pour la mise à jour, ça marche maintenant! Merci beaucoup. – rom

Questions connexes