Ответ 1
Параметры GET не имеют ничего общего с URL-адресом, который возвращается reverse
. Просто добавьте его в конец:
url = "%s?name=joe" % reverse(viewOne)
Я использую django 1.2 и перехожу из одного представления в другое, используя обратный метод urlresolvers.
url = reverse(viewOne)
и я хочу передать параметр get, например
name = 'joe'
так что в viewOne, если я делаю
def viewOne(request):
request.GET['name']
i получит
joe
как это сделать?
Параметры GET не имеют ничего общего с URL-адресом, который возвращается reverse
. Просто добавьте его в конец:
url = "%s?name=joe" % reverse(viewOne)
Более безопасный и более гибкий способ:
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
в качестве словаря.
Это очень похоже на решение 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'
Извините за задержку коррекции на этом.
Хотя оба ответа здесь слишком хорошо справляются с заданной задачей, я думаю, что просто простая функция 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('&')