使用 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。如果设置为Truequery_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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)