我是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/'.
如果您希望能够发布包含其他信息的重定向,则需要在网址中为其定义地点,或者以不同的方式添加地址.
两种方式相当常见:
使用查询参数 - 这会将消息明确地发送给客户端; 如果你不小心,人们可以制作网址,让你的索引页面说出他们想要的任何东西.
return redirect(reverse('page-index')+"?error_message=test"))
Run Code Online (Sandbox Code Playgroud)在会话中存储消息并在下一页加载时将其拉出 - 这要求您配置会话,并跟踪服务器端的所有内容,而不是依赖客户端向您发回错误消息:
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)使用消息框架 - 这比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)
| 归档时间: |
|
| 查看次数: |
11526 次 |
| 最近记录: |