web-dev-qa-db-fra.com

Comment passer des paramètres GET en utilisant 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

name = 'joe'

de sorte que dans la vue, si je le fais

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

J'aurai

joe

comment je fais ça ?

73
yossi

Les paramètres GET n'ont rien à voir avec l'URL renvoyée par reverse. Ajoutez-le simplement à la fin:

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

Une manière plus sûre et plus flexible:

import urllib
from Django.core.urlresolvers 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 placer vos paramètres GET comme un dictionnaire.

65
Amir Ali Akbari

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'
15
clime