我正在尝试在网址中包含用户名,但我无法再注销而不会收到此错误:
它追溯到views.py中的这一行:
u = MyUser.objects.get(username=username)
知道我做错了吗?
这是我的views.py:
@login_required
def account_home(request, username):
u = MyUser.objects.get(username=username)
return render(request, "accounts/account_home.html", {})
def auth_logout(request):
logout(request)
return HttpResponseRedirect('/')
urls.py
urlpatterns += patterns('accounts.views',
# url(r'^account/$', 'account_home', name='account_home'),
url(r'^(?P<username>[\w.@+-]+)/$', 'account_home', name='account_home'),
url(r'^logout/$', 'auth_logout', name='logout'),
url(r'^login/$', 'auth_login', name='login'),
url(r'^register/$', 'auth_register', name='register'),
)
谢谢你们!
答案 0 :(得分:2)
Django使用与您的查询匹配的第一个视图。由于您的account_home
视图是列表中的第一个视图,并且它与/logout/
,/login/
和/register/
匹配,因此所有这些网址都指向account_home
视图。由于您没有拥有这些名称的用户,因此会收到该错误。
要修复它,至少需要做的是将account_home
视图移动到列表的末尾。您可能还想添加一些正确处理不存在的用户的代码,例如: get_object_or_404
答案 1 :(得分:0)
问题在于你的网址匹配正则表达式。 Django使用第一个匹配模式,/logout/
匹配r'^(?P<username>[\w.@+-]+)/$'
- 它正在寻找名为logout
的用户。
您可以重新排序网址模式以将用户名模式放在最后,或者(更好的解决方案)在您的模式中添加一些明确的内容,例如r'^/account/(?P<username>[\w.@+-]+)/$'
。