重定向到视图时的 Django NoReverseMatch

Posted

技术标签:

【中文标题】重定向到视图时的 Django NoReverseMatch【英文标题】:Django NoReverseMatch when redirecting to view 【发布时间】:2018-10-21 04:36:50 【问题描述】:

正确登录后,我想将用户重定向到另一个页面,因此我使用了重定向,但出现 NoReverseMatch 错误。

Reverse for 'watchfilms' with arguments '()' and keyword arguments '' not found.

我不知道出了什么问题,所以我向您展示了我的 urls.py 和 views.py 文件。也许你看到了什么不对劲...

项目的 url.py

urlpatterns = patterns('',
    url(r'^films/', include('films.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

应用的 url.py

urlpatterns = patterns('',
    url(r'^$', 'films.views.index'),
    url(r'^signup$', 'films.views.signUp'),
    url(r'^login$', 'films.views.logIn'),
    url(r'^signedupok$', 'films.views.signedUpOk'),
    url(r'^watchfilms$', 'films.views.watchFilms'),
    url(r'^logout$', 'films.views.logout'),
)

views.py

...

def logIn(request):
    error = ""
    username = request.POST.get('username', False)
    pass = request.POST.get('password', False)
    user = authenticate(username = username, password = pass)
    if username or pass:
            if user is not None:
                    if user.is_active:
                            login(request, user)
                            return redirect('watchfilms')
                    else:
                            error = 'Error while login!'
            else:
                    errorea = 'Data is not correct!'
    return render(request, 'films/login.html', 'error': error)

@login_required
def watchFilms(request):
    film_list = Film.objects.all()
    paginator = Paginator(film_list, 3)
    page = request.GET.get('page')
    try:
            films = paginator.page(page)
    except PageNotAnInteger:
            films = paginator.page(1)
    except EmptyPage:
            films = paginator.page(paginator.num_pages)
    return render(request, 'films/watchFilms.html', 'films': films)

...

登录成功后,应该调用 watchFilms 视图,但似乎找不到(我不明白为什么,我认为 urls.py 是可以的)...

【问题讨论】:

为您的网址格式中的每个网址添加一个名称 【参考方案1】:

如果你想反转它,你应该命名你的 url 模式:

url(r'^watchfilms$', 'films.views.watchFilms', name='watchfilms'),

确保大写与redirect() 调用中的相同(即全部小写)。

【讨论】:

成功了!谢谢!【参考方案2】:

redirect 函数将模型、视图或绝对或相对 url 作为输入。

然而,Django 抱怨它找不到给定参数的任何 URL。

可能最好的办法是传递一个对视图函数的引用,这样如果你以后更改 url,它仍然可以工作:

def logIn(request):
    error = ""
    username = request.POST.get('username', False)
    passw = request.POST.get('password', False)
    user = authenticate(username = username, password=passw)
    if username or passw:
            if user is not None:
                    if user.is_active:
                            login(request, user)
                            return redirect(watchFilms)
                    else:
                            error = 'Error while login!'
            else:
                    errorea = 'Data is not correct!'
    return render(request, 'films/login.html', 'error': error)

请不要使用名为 pass 的变量。 pass 是 Python 关键字,通常解释器会在此错误。

【讨论】:

感谢您的回答,我会更改变量的名称

以上是关于重定向到视图时的 Django NoReverseMatch的主要内容,如果未能解决你的问题,请参考以下文章

Django 使用绑定表单重定向到另一个视图

django 重定向到查看

重定向到另一个域的 Django 视图

python - Django内置登录视图不重定向到下一个

django重定向导致重定向到下一页,但然后返回原始?

django 重定向到另一个带有上下文的视图