Wie übergebe ich GET-Parameter mit django urlresolvers reverse

81

Ich verwende Django 1.2 und gehe mit der umgekehrten Methode von urlresolvers von einer Ansicht zur nächsten.

url = reverse(viewOne)

und ich möchte zum Beispiel einen get-Parameter übergeben

name = 'joe'

so dass in der viewOne wenn ich das tue

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

ich werde bekommen

joe

wie mache ich das ?

Yossi
quelle
4
Schauen Sie sich diese Antwort an , die eine ziemlich gute Möglichkeit bietet, so etwas zu tun.
Sberder
1
Ich habe eine Feature-Anfrage erstellt: code.djangoproject.com/ticket/25582
guettli

Antworten:

149

GET-Parameter haben nichts mit der von zurückgegebenen URL zu tun reverse. Fügen Sie es einfach am Ende hinzu:

url = "%s?name=joe" % reverse(viewOne)
Daniel Roseman
quelle
8
Dies funktioniert für dieses Beispiel. Da keine Anführungszeichen erstellt werden, schlägt dies fehl, wenn Sie Werte verwenden, die in Anführungszeichen gesetzt werden müssen.
Guettli
75

Ein sicherer und flexiblerer Weg:

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

dann können Sie verwenden build_url:

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

Dies verwendet dieselben Argumente wie reverse, bietet jedoch ein zusätzliches Schlüsselwortargument, getin das Sie Ihre GETParameter als Wörterbuch einfügen können.

Amir Ali Akbari
quelle
12
Hinweis: Die django.utils.http.urlencodeFunktion von Django ist möglicherweise vorzuziehen, da es sich um eine "Version der Funktion urllib.urlencode () von Python handelt, die mit Unicode-Zeichenfolgen arbeiten kann": docs.djangoproject.com/de/1.10/ref/utils/…
Dolan Antenucci
17

Dies ist der Lösung von Amir sehr ähnlich, behandelt jedoch auch Listen.

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()

Anwendungsbeispiel:

>>> build_url('member-list', params={'format': 'html', 'sex': ['male', 'female']})
u'/members/?format=html&sex=male&sex=female'
Klima
quelle
Was bringt es sex=male&sex=female? Ich denke, es sollte sein &sex[]=female&sex[]=female(beachten Sie das zusätzliche []), ein GET-Anforderungsarray zu sein
Motatoes
3
@ Potatoes Das []sind eine PHP-Konvention.
Jonas Schäfer
-2

Entschuldigen Sie die verspätete Korrektur.

Während beide Antworten hier die erforderliche Aufgabe zu gut bewältigen, denke ich, dass nur eine einfache Funktion zum Urlencode eines Wörterbuchs die flexibelste Möglichkeit ist, dies zu tun:

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('&')
Avik Samaddar
quelle
1
Dies gilt nicht urlencode das Wörterbuch - es gibt keine Umgang mit URL reservierte Zeichen (zB #, ?) oder jede Art von URL-Encoding: en.wikipedia.org/wiki/Percent-encoding
JamesC