90 votes

Comment passer les paramètres GET à l'aide de django urlresolvers reverse

J'utilise Django 1.2 et je passe d'une vue à l'autre en utilisant la méthode inverse urlresolvers.

 url = reverse(viewOne)

et je veux passer un paramètre get, par exemple

nom = 'joe'

de sorte que dans la vueOne si je le fais

 def viewOne(request):
    request.GET['name']

j'aurai

 joe

comment je fais ça ?

163voto

Daniel Roseman Points 199743

Les paramètres GET n'ont rien à voir avec l'URL renvoyée par reverse . Il suffit de l'ajouter à la fin :

 url = "%s?name=joe" % reverse(viewOne)

84voto

Amir Ali Akbari Points 1157

Un moyen plus sûr et plus flexible :

 import urllib
from django.urls import reverse


def build_url(*args, **kwargs):
    get = kwargs.pop('get', {})
    url = reverse(*args, **kwargs)
    if get:
        url += '?' + urllib.urlencode(get)
    return url

alors vous pouvez utiliser build_url :

 url = build_url('view-name', get={'name': 'joe'})

qui prend les mêmes arguments que reverse , mais fournit un argument de mot-clé supplémentaire get où vous pouvez y mettre vos GET en tant que dictionnaire.

22voto

clime Points 2431

Ceci est très similaire à la solution d'Amir mais gère également les listes.

 from django.core.urlresolvers import reverse
from django.http import QueryDict

def build_url(*args, **kwargs):
    params = kwargs.pop('params', {})
    url = reverse(*args, **kwargs)
    if not params: return url

    qdict = QueryDict('', mutable=True)
    for k, v in params.iteritems():
        if type(v) is list: qdict.setlist(k, v)
        else: qdict[k] = v

    return url + '?' + qdict.urlencode()

Exemple d'utilisation :

 >>> build_url('member-list', params={'format': 'html', 'sex': ['male', 'female']})
u'/members/?format=html&sex=male&sex=female'

-2voto

Avik Samaddar Points 313

Désolé pour la correction tardive à ce sujet.

Bien que les deux réponses ici gèrent trop bien la tâche requise, je pense qu'une simple fonction pour coder en URL un dictionnaire est le moyen le plus flexible de le faire :

 import urllib

def getify(dic):
    st = ''
    for K, V in dic.items():
        K = urllib.parse.quote(str(K))
        if isinstance(V, list):
            for v in V:
                st += K + '=' + urllib.parse.quote(str(v)) + '&'
        else:
            st += K + '=' + urllib.parse.quote(str(V)) + '&'
    return st.rstrip('&')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X