Как я могу передать вам параметры, используя urlresolvers Джанго обратного
Я использую django 1.2 и иду от одного представления к другому, используя обратный метод urlresolvers.
url = reverse(viewOne)
и я хочу передать параметр get, например
name = 'joe'
Так что в viewOne, если я делаю
def viewOne(request):
request.GET['name']
Я
joe
как мне это сделать ?
4 ответа:
параметры 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
параметры в нем как словарь.
Это очень похоже на решение Амира, а также маркеры списков.
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('&')