Как передать параметры GET с помощью обратных ссылок на django? - PullRequest
71 голосов
/ 06 марта 2012

Я использую django 1.2 и перехожу из одного представления в другое с помощью обратного метода urlresolvers.

url = reverse(viewOne)

и хочу передать параметр get, например

name = 'joe'

, чтобы в viewOne, если я сделаю

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

, я получу

joe

как мне это сделать?

Ответы [ 4 ]

127 голосов
/ 06 марта 2012

GET-параметры не имеют ничего общего с URL-адресом, возвращаемым reverse. Просто добавьте его в конце:

url = "%s?name=joe" % reverse(viewOne)
63 голосов
/ 31 октября 2012

Более безопасный и гибкий способ:

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

, тогда вы можете использовать build_url:

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

, который принимает те же аргументы, что и reverse, но предоставляет дополнительное ключевое словоАргумент get, где вы можете поместить в него GET параметры в виде словаря.

14 голосов
/ 09 декабря 2013

Это очень похоже на решение Амира, но также обрабатывает списки.

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'
0 голосов
/ 14 ноября 2015

Извините за задержку исправления.

Хотя оба ответа здесь слишком хорошо справляются с требуемой задачей, я думаю, что простая функция для 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('&')
...