重定向查看时 Django NoReverseMatch
Django NoReverseMatch when redirecting to view
正确登录后,我想将用户重定向到另一个页面,因此我使用了重定向,但出现了 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 可以)...
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(<b>watchFilms</b>)
else:
error = 'Error while login!'
else:
errorea = 'Data is not correct!'
return render(request, 'films/login.html', {'error': error})
请不要使用名为 pass
的变量。 pass
是一个 Python 关键字,通常解释器会对此出错。
如果你想反转它,你应该命名你的 url 模式:
url(r'^watchfilms$', 'films.views.watchFilms', name='watchfilms'),
确保大写与您的 redirect()
调用中的相同(即全部小写)。
正确登录后,我想将用户重定向到另一个页面,因此我使用了重定向,但出现了 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 可以)...
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(<b>watchFilms</b>)
else:
error = 'Error while login!'
else:
errorea = 'Data is not correct!'
return render(request, 'films/login.html', {'error': error})
请不要使用名为 pass
的变量。 pass
是一个 Python 关键字,通常解释器会对此出错。
如果你想反转它,你应该命名你的 url 模式:
url(r'^watchfilms$', 'films.views.watchFilms', name='watchfilms'),
确保大写与您的 redirect()
调用中的相同(即全部小写)。