使用 django.shortcuts.redirect 添加 request.GET 变量
Posted
技术标签:
【中文标题】使用 django.shortcuts.redirect 添加 request.GET 变量【英文标题】:add request.GET variable using django.shortcuts.redirect 【发布时间】:2011-04-15 12:27:12 【问题描述】:是否可以在重定向中添加 GET 变量? (无需修改我的 urls.py)
如果我这样做redirect('url-name', x)
我收到HttpResponseRedirect('/my_long_url/%s/', x)
我没有抱怨使用HttpResponseRedirect('/my_long_url/%s/?q=something', x)
,但只是想知道......
【问题讨论】:
Manoj Govindan 回答中的小错字: params = urllib.urlencode(**kwargs) 需要替换为 params = urllib.urlencode(kwargs) 否则你会得到“TypeError: urlencode() got意外的关键字参数” 【参考方案1】:由于重定向只返回一个 HttpResponseRedirect
对象,您可以更改它:
response = redirect('url-name', x)
response['Location'] += '?your=querystring'
return response
【讨论】:
如果可能的话,很容易使用urldefrag
。如果您的 url 响应中有锚点,感谢您指出潜在的错误。
最佳答案
@Kolyunya:你确定吗?我将它与锚一起使用【参考方案2】:
是否可以在重定向中添加 GET 变量? (无需修改我的 urls.py)
我不知道有什么方法可以做到这一点修改urls.py
。
我没有抱怨使用 HttpResponseRedirect('/my_long_url/%s/?q=something', x) 代替,但只是想知道......
您可能想编写一个瘦包装器来简化此操作。说,custom_redirect
def custom_redirect(url_name, *args, **kwargs):
from django.core.urlresolvers import reverse
import urllib
url = reverse(url_name, args = args)
params = urllib.urlencode(kwargs)
return HttpResponseRedirect(url + "?%s" % params)
然后可以从您的视图中调用它。例如
return custom_redirect('url-name', x, q = 'something')
# Should redirect to '/my_long_url/x/?q=something'
【讨论】:
这不是 Django 框架的一部分,这太疯狂了……背后有什么哲学原因吗?【参考方案3】:我们可以从 django 导入 urlencode。
from django.utils.http import urlencode
get_args_str = urlencode('q': 'something')
或者我们可以使用未解析的获取参数字符串从开始请求
get_args_str = request.META['QUERY_STRING']
HttpResponseRedirect('%s?%s' % (url, get_args_str))
【讨论】:
我认为应该删除x
以使其正常工作。否则,x
的内容将作为正文添加到 HTTP 响应中,而它应该为空。
是的。感谢您发现此错误。已编辑。【参考方案4】:
我认为值得注意的是,Django 的RedirectView
类有一个内置的类属性query_string
,它可以被覆盖或传递给as_view
。如果设置为True
,query_string
将保留重定向中的查询字符串。例如,您可以在urls.py
中输入以下内容:
path('example-redirect/',
RedirectView.as_view(url='https://example.com', query_string=True),
name='example_redirect')
【讨论】:
以上是关于使用 django.shortcuts.redirect 添加 request.GET 变量的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)