Django urlresolvers reverse를 사용하여 GET 매개 변수를 전달하는 방법


81

django 1.2를 사용하고 있으며 urlresolvers reverse 메서드를 사용하여 한 뷰에서 다른 뷰로 이동합니다.

url = reverse(viewOne)

예를 들어 get 매개 변수를 전달하고 싶습니다.

이름 = '조'

그래서 viewOne에서

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

나는 얻을 것이다

joe

어떻게해야합니까?


4
이런 종류의 일을 수행하는 다소 좋은 방법을 제공하는 대답 을 살펴보십시오 .
sberder

1
기능 요청을 생성했습니다. code.djangoproject.com/ticket/25582
guettli

답변:


150

GET 매개 변수는에서 반환하는 URL과 관련이 없습니다 reverse. 끝에 추가하기 만하면됩니다.

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

8
이 예제에서 작동합니다. 인용이 수행되지 않기 때문에 인용해야하는 값을 사용하면 실패합니다.
guettli

75

더 안전하고 유연한 방법 :

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

다음을 사용할 수 있습니다 build_url.

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

이는와 동일한 인수를 취하지 reverse만 매개 변수를 사전으로 get넣을 수 있는 추가 키워드 인수를 제공합니다 GET.


12
참고 : Django의 django.utils.http.urlencode함수는 "유니 코드 문자열에서 작동 할 수있는 Python의 urllib.urlencode () 함수 버전"이므로 더 바람직 할 수 있습니다. docs.djangoproject.com/en/1.10/ref/utils/…
Dolan Antenucci

18

이것은 Amir의 솔루션과 매우 유사하지만 목록도 처리합니다.

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

사용 예 :

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

갖는 요점은 무엇입니까 sex=male&sex=female? GET 요청 배열 이되어야한다고 생각합니다 &sex[]=female&sex[]=female(추가 참고 [])
motatoes

3
@potatoes []는 PHP 규칙입니다.
Jonas Schäfer

-2

지연된 수정에 대해 죄송합니다.

여기의 두 답변 모두 필요한 작업을 너무 잘 처리하지만 사전을 urlencode하는 간단한 기능이 가장 유연한 방법이라고 생각합니다.

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

1
이것은 않습니다 하지 사전를 urlencode - URL의 어떤 취급이없는 예약 된 문자 (예를 들어 #, ?) 또는 퍼센트 인코딩 모든 종류의 : en.wikipedia.org/wiki/Percent-encoding
jamesc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.