使用django重定向错误。似乎没什么用

时间:2016-11-24 20:00:42

标签: python django

我知道有很多关于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,对吧?我现在已经被困了一段时间。

2 个答案:

答案 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'),