2010-03-02 3 views
1

J'ai une vue simple de Django qui retourne juste les paramètres d'URL, mais si j'utilise plusieurs fois la même clé de paramètre, je n'arrive pas à y accéder. Pensez à la mise en place suivante:Clé de paramètre d'URL de Django utilisée deux fois

urls.py:

(r'^header/$',header) 

Voir fonction:

def header(request) 
    return render_to_response('header.html',locals(),mimetype='text/plain') 

Modèle:

{{ request.GET }} 
{% for key,val in request.GET %} 
{{ key }} : {{ val }} 
{% endfor %} 

URL:

  • http://mysite/header/?item=1&item=2

Réponse:

<QueryDict: {u'item': [u'1', u'2']}> 

item : 2 

Si l'entrée 'article' ont la valeur de '1,2' ou "[ '1', '2']"? Notez ce que retourne le GET complet. Comment puis-je obtenir les deux valeurs?

Répondre

5

Jetez un oeil à la documentation pour le QueryDict qui est utilisé pour contenir les attributs GET/POST.

Plus précisément:

QueryDict est une classe de dictionnaire comme mesure pour faire face à plusieurs valeurs pour la même clé. Cela est nécessaire car certains éléments de formulaire HTML, notamment <select multiple="multiple">, transmettent plusieurs valeurs pour la même clé.

Vous voulez probablement utiliser QueryDict.lists():

q = QueryDict('a=1&a=2&a=3') 
q.lists() 
[(u'a', [u'1', u'2', u'3'])] 
1

Il renvoie les valeurs multiples dans une liste. Dans le back-end, vous pouvez simplement vérifier si la variable est une liste ou non, puis traiter les cas en conséquence. Il semble qu'il y ait une certaine logique pour retourner la dernière valeur assignée à une clé si vous la contractez à une chaîne comme vous le faites.

+0

est-il pas de mécanisme pour le faire à partir du modèle? – kzh

+0

@kzh - Vous ne voulez pas faire cela dans le modèle, vous voulez le faire dans la vue. –

+0

@Dom - Je ne le ferais généralement pas, mais j'étais curieux de savoir si Django avait un mécanisme pour cela, c'est tout. – kzh