我如何使用 django urlresolvers 反向传递 GET 参数
Posted
技术标签:
【中文标题】我如何使用 django urlresolvers 反向传递 GET 参数【英文标题】:How do i pass GET parameters using django urlresolvers reverse 【发布时间】:2012-03-24 00:53:32 【问题描述】:我正在使用 django 1.2 并使用 urlresolvers 反向方法从一个视图转到另一个视图。
url = reverse(viewOne)
我想传递一个get参数,例如
name = '乔'
如果我这样做了,那么在 viewOne 中
def viewOne(request):
request.GET['name']
我会得到
joe
我该怎么做?
【问题讨论】:
看看that answer,它提供了一种相当不错的方法来做这种事情。 我创建了一个功能请求:code.djangoproject.com/ticket/25582 【参考方案1】:GET 参数与reverse
返回的 URL 无关。只需在最后添加即可:
url = "%s?name=joe" % reverse(viewOne)
【讨论】:
这适用于这个例子。由于没有完成引用,因此如果您使用需要引用的值,则会失败。【参考方案2】:更安全、更灵活的方式:
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
参数作为字典放入其中。
【讨论】:
注意:Django 的django.utils.http.urlencode
函数可能更可取,因为它是“可以对 unicode 字符串进行操作的 Python 的 urllib.urlencode() 函数版本”:docs.djangoproject.com/en/1.10/ref/utils/…
我会将此函数重命名为 reverse_with_params()
或类似名称。【参考方案3】:
这与 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
有什么意义?我认为应该是&sex[]=female&sex[]=female
(注意附加的[]
),是一个GET请求数组
@potatoes []
是 php 约定。【参考方案4】:
抱歉,对此延迟更正。
虽然这里的两个答案都很好地处理了所需的任务,但我认为只是一个简单的函数来对字典进行 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('&')
【讨论】:
这 not 对字典进行 urlencode - 不处理 URL 保留字符(例如#
、?
)或任何类型的百分比编码:en.wikipedia.org/wiki/Percent-encoding 以上是关于我如何使用 django urlresolvers 反向传递 GET 参数的主要内容,如果未能解决你的问题,请参考以下文章
错误:'没有名为'django.core.urlresolvers'的模块
Django 中的 login_required 装饰器和 urlresolver.reverse()
我不知道何时在 django.core.urlresolvers 模块中使用 reverse()
ImportError:没有名为'django.core.urlresolvers'的模块:但是先天
django.core.urlresolver.reverse - NoReverseMatch:“...”的反向参数“()”和关键字参数“”未找到
django locale-url import error cannot import name 'urlresolvers' from 'django.core'