Django与kwarg重定向

Jus*_*us1 11 django redirect

我是python和django的新手,我对重定向功能有疑问.

这是我的views.py文件的简化版本.

def page_index(request, error_message=''):
    print error_message

def add_page(request):
    return redirect('page_index') # this work fine
    return redirect('page_index', error_message='test') # this does not work
Run Code Online (Sandbox Code Playgroud)

这是我的urls.py的简短版本

urlpatterns = patterns(
    'x.views',
    url(r'^$', 'page_index', {'error_message': 't'}, name='page_index'),
    url(r'^add/$', 'add_page', name='add_page'),
)
Run Code Online (Sandbox Code Playgroud)

当我尝试重定向到page_index没有关键字参数一切正常,但当我使用kwag时,我收到以下错误消息:

NoReverseMatch at/pages/add /

使用参数'()'和关键字参数'{'error_message':'test'}'找不到'page_index'.

我究竟做错了什么?

Ian*_*and 15

简短回答:您的网址方案中没有"error_message"关键字的地方.

更长的回答:

redirect()函数调用reverse()来构建URL; 它将通过返回带有302重定向状态代码的HTTP响应和新URL来将用户的浏览器发送到该URL.您提供给reverse()的任何关键字参数都应该作为URL的一部分结束 - 这就是它们与用户沟通的方式.

但是,在您的情况下,'page_index`的网址只是定义为'^ $' - 这是根网址,在浏览器中看起来像'http://yoursite.com/'.

如果您希望能够发布包含其他信息的重定向,则需要在网址中为其定义地点,或者以不同的方式添加地址.

两种方式相当常见:

  1. 使用查询参数 - 这会将消息明确地发送给客户端; 如果你不小心,人们可以制作网址,让你的索引页面说出他们想要的任何东西.

    return redirect(reverse('page-index')+"?error_message=test"))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在会话中存储消息并在下一页加载时将其拉出 - 这要求您配置会话,并跟踪服务器端的所有内容,而不是依赖客户端向您发回错误消息:

    def add_page(request):
        request.session['error_message'] = 'test'
        return redirect('page-index')
    
    def page_index(request):
        print request.session.get('error_message','')
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用消息框架 - 这比ad-hoc会话属性更受欢迎,只要您在同一页面上不需要太多"类型"消息即可.但是,如果您拥有的所有内容都是模板中的错误消息空间,那么这非常简单:

    from django.contrib.messages import error
    
    def add_page(request):
        error(request, 'test')
        return redirect('page-index')
    
    Run Code Online (Sandbox Code Playgroud)

    然后在你的基本模板中,在某个地方有一个这样的块(可能比这更复杂;样式,甚至):

    {% for message in messages %}
        <p>{{ message }}</p>
    {% endfor %}
    
    Run Code Online (Sandbox Code Playgroud)

双方所有的情况下,虽然,你可以从你的urls.py删除参数-消息本身不会成为URL路径组件的一部分.

 urlpatterns = patterns(
    'x.views',
     url(r'^$', 'page_index', name='page_index'),
     url(r'^add/$', 'add_page', name='add_page'),
 )
Run Code Online (Sandbox Code Playgroud)