Як передати параметри GET, використовуючи django urlresolvers reverse


81

Я використовую django 1.2 і переходжу з одного подання на інше за допомогою методу зворотних urlresolvers.

url = reverse(viewOne)

і я хочу передати параметр get, наприклад

name = 'Джо'

так що в 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.utils.http.urlencodeФункція Django може бути кращою, оскільки це "версія функції urllib.urlencode () Python, яка може працювати на рядку Unicode": docs.djangoproject.com/en/1.10/ref/utils/…
Dolan Antenucci

18

Це дуже схоже на рішення Аміра, але також обробляє списки.

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? Я думаю, це повинно бути &sex[]=female&sex[]=female(зверніть увагу на додаткове []), бути масивом запитів GET
motatoes

3
@potatoes []- це конвенція PHP.
Йонас Шефер,

-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.