2009-09-05 7 views
1

Je possède ce dictionnaire dans mon applications fichier modèle:(re) Utilisation des dictionnaires dans les vues django

TYPE_DICT = (
    ("1", "Shopping list"), 
    ("2", "Gift Wishlist"), 
    ("3", "test list type"), 
    ) 
modèle

, qui utilise ce dict est la suivante:

class List(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=200) 
    type = models.PositiveIntegerField(choices=TYPE_DICT) 

Je veux réutiliser dans mes vues et l'a importé de apps.models. Je crée une liste de dictioneries à utiliser à mon avis comme celui-ci:

bunchofdicts = List.objects.filter(user=request.user) 
    array = [] 
    for dict in bunchofdicts: 
     ListDict = {'Name':dict.name, 'type':TYPE_DICT[dict.type], 'edit':'placeholder' } 
     array.append(ListDict) 

Quand j'utilise cette liste dans mon modèle, alors il me donne des résultats très étranges. Au lieu de me renvoyer le type de la liste (liste de courses) il me renvoie ('2', 'Liste de cadeaux'). Donc je peux comprendre ce qu'il fait (dans ce cas, le dict.type est égal à 1, et il devrait me renvoyer "shopping list", mais il me renvoie [1] - second, élément dans la liste). Ce que je ne comprends pas, pourquoi faire exactement la même chose dans un shell python donne des résultats différents.

le faire comme je le fais dans django (TYPE_DICT [dict.type]), fonctionne comme décrit ci-dessus et crée une erreur dans le shell python. en utilisant TYPE_DICT [str (dict.type)] dans la coquille de python fonctionne très bien, mais crée cette erreur dans django:

TypeError at /list/ 

tuple indices must be integers, not str 

Request Method:  GET 
Request URL: http://127.0.0.1/list/ 
Exception Type:  TypeError 
Exception Value:  

tuple indices must be integers, not str 

Exception Location:  /home/projects/tst/list/views.py in list, line 22 
Python Executable: /usr/bin/python 
Python Version:  2.6.2 

Peut-être que je l'ai fait quelque chose de mal ou différent shell python. Qu'est-ce que j'ai fait était:

python 
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> dict = {'1':'shoppinglist', '2':'giftlist','3':'testlist'} 
>>> print dict[1] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 1 
>>> print dict[str(1)] 
shoppinglist 
>>> x = 1 
>>> print dict[x] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 1 
>>> print dict[str(x)] 
shoppinglist 
>>> 

alors quel est le problème ici?

Alan

Répondre

6

Votre TYPE_DICT dans votre fichier modèles n'est pas un dictionnaire: il est un tuple de tuples.

Vous pouvez facilement faire un dictionnaire de celui-ci que si vous voulez:

TYPE_DICT_DICT = dict(TYPE_DICT) 

vous pouvez utiliser TYPE_DICT_DICT comme un véritable dictionnaire.

+0

Merci. C'est exactement ce que j'ai réalisé dès que je suis allé au lit: P –

-1

Vous créez un tuple, pas un dict.

TYPE_DICT = { 
    1: "Shopping list", 
    2: "Gift Wishlist", 
    3: "test list type", 
} 

est un dict (mais ce n'est pas ce que veut le choix).

0

tout d'abord, modifier votre tuple au format dictionnaire .. puis, lors de l'accès au modèle de django vous devez assumer la clé de ce dictionnaire comme un attribut ... Disons que c'est le dictionnaire

TYPE_DICT = { 
    1: 'Shopping list', 
    2: 'Gift Wishlist', 
    3: 'test list type', 
} 

lorsque vous accédez à ce dictionnaire dans le modèle de django, vous devez utiliser comme cette

TYPE_DICT.1 
0

Bonjour je tentais de le faire depuis hier et aujourd'hui, je compris votre boîte make your own filter de sorte que vous pouvez passer la clé de dictionnaire (qui est stocké dans la ré atabase).

je tentais d'obtenir ce à travailler avec les États, et comme je l'utiliser dans beaucoup de modèles je l'ai ajouté aux paramètres de sorte qu'il va comme ceci:

dans settings.py

... 
CSTM_LISTA_ESTADOS = (
    ('AS','Aguascalientes'), 
    ('BC','Baja California'), 
... 
    ('YN','Yucatan'), 
    ('ZS','Zacatecas') 
) 
... 

dans mon customtags.py

@register.filter(name='estado') 
def estado(estado): 
    from settings import CSTM_LISTA_ESTADOS 
    lista_estados = dict(CSTM_LISTA_ESTADOS) 
    return lista_estados[estado] 

dans mon modèle basicas.html

{{oportunidad.estado|estado}} 

oportunidad est la variable je passe au modèle

Hope this helps autres personnes

Questions connexes