我知道有很多关于django重定向的帖子。但是我没有找到类似我的问题。我不知道发生了什么,但我已经阅读了很多,但仍然没有发现任何相关信息。
所以我发布了我的代码。
我的项目urls.py:
from django.conf.urls import url, include
urlpatterns = [
url(r'^backbone', include('backbone.urls', namespace='backbone')),
]
我的应用urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^/shell$', views.shell, name='shell'),
url(r'^/login$', views.login, name='login'),
]
我的应用views.py
def shell(request, app='cashier'):
if 'user' not in request.session:
response = redirect('backbone:login', app=app)
else:
response = render(request, 'template.html')
return response
def login(request, app):
context = {
'app': app,
}
response = render(request, 'backbone/login.html', context)
return response
控制台上出现错误:
django.urls.exceptions.NoReverseMatch: Reverse for 'login' with arguments '()' and keyword arguments '{'app': 'app'}' not found. 1 pattern(s) tried: ['backbone/login$']
浏览器错误:
NoReverseMatch at /backbone/shell
Reverse for 'login' with arguments '()' and keyword arguments '{'app': 'app'}' not found. 1 pattern(s) tried: ['backbone/login$']
Request Method: GET
Request URL: http://192.168.1.79/backbone/shell
Django Version: 1.10.3
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'login' with arguments '()' and keyword arguments '{'app': 'app'}' not found. 1 pattern(s) tried: ['backbone/login$']
Exception Location: /usr/local/lib/python3.5/dist-packages/django/urls/resolvers.py in _reverse_with_prefix, line 392
Python Executable: /usr/bin/python3
Python Version: 3.5.2
Python Path:
['/home/ipi/workspace/RamoSP',
'/usr/lib/python35.zip',
'/usr/lib/python3.5',
'/usr/lib/python3.5/plat-x86_64-linux-gnu',
'/usr/lib/python3.5/lib-dynload',
'/usr/local/lib/python3.5/dist-packages',
'/usr/lib/python3/dist-packages']
Server time: Thu, 24 Nov 2016 19:56:47 +0000
我不明白。我发送它需要的args,对吧?我现在已经被困了一段时间。
答案 0 :(得分:4)
不,您正在尝试访问此网址:
url(r'^/login$', views.login, name='login')
带有它不期望的参数,因为它不期望任何参数。
查看this post,特别是向视图发送参数主题。它将帮助您理解为什么您不能在此URL中向视图发送参数。
顺便说一下,您可能希望将请求中的查询参数发送到此网址。在这种情况下,而不是:
redirect('backbone:login', app=app)
你将不得不这样做:
url = '{}?app={}'.format(reverse('backbone:login'), '?item=4')
redirect(url)
答案 1 :(得分:3)
你想要什么?
/backbone/login?app=cashier
解决方案:https://stackoverflow.com/a/3766503/6622256
或
/backbone/login/cashier
解决方案:
在路线声明中添加参数'app':
url(r'^login/(?P<app>)$', views.login, name='login'),