当我使用不正确的凭据登录时出现错误

问题描述:

因此,当我输入正确的用户名/密码时,登录工作正常。然而,当我输入了不正确的用户名或密码,它返回此错误:当我使用不正确的凭据登录时出现错误

AttributeError: AnonymousUser' object has no attribute '_meta' 

这里是我的代码:

views.py

def boxes_view(request): 

    ... 

    form = UserRegistrationForm(request.POST or None) 

    form_login = UserLoginForm(request.POST or None) 

    if request.user.is_authenticated(): 
     print('LOGGED IN') 

    context = { 
     'form': form, 
     'form_login': form_login 
    } 

    return render(request, 'polls.html', context) 


def register(request): 
    form = UserRegistrationForm(request.POST or None) 
    if form.is_valid(): 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 
     email = form.cleaned_data['email'] 
     user = User.objects.create_user(username=username, password=password, email=email) 
     user.save() 
     user = authenticate(username=username, password=password, email=email) 
     login(request, user) 
     return redirect('/') 
    else: 
     print(form.errors) 
     print(form.non_field_errors) 
     form = UserRegistrationForm() 
    return redirect('/') 


def user_login(request): 
    form_login = UserLoginForm(request.POST or None) 
    if form_login.is_valid(): 
     username = form_login.cleaned_data['username'] 
     password = form_login.cleaned_data['password'] 
     user = authenticate(username=username, password=password) 
     login(request, user) 
     return redirect('/') 
    else: 
     print(form_login.errors) 
     print(form_login.non_field_errors) 
     form_login = UserLoginForm() 
    return redirect('/') 


def user_logout(request): 
    logout(request) 
    return redirect('/') 

forms.py

class UserLoginForm(forms.Form): 
    username = forms.CharField(max_length=25) 
    password = forms.CharField(widget=forms.PasswordInput) 

    class Meta: 
     model = User 

     fields = [ 
      'username', 
      'password', 
     ] 


class UserRegistrationForm(forms.Form): 
    email = forms.EmailField() 
    username = forms.CharField(max_length=25) 
    password = forms.CharField(widget=forms.PasswordInput) 
    confirm_password = forms.CharField(widget=forms.PasswordInput) 

    class Meta: 
     model = User 

     fields = [ 
      'username', 
      'email', 
      'password', 
      'confirm_password', 
     ] 

    def clean(self): 
     email = self.cleaned_data.get('email') 

     current_emails = User.objects.filter(email=email) 

     if current_emails.exists(): 
      raise forms.ValidationError("That email is taken") 

urls.py

BV = views.boxes_view 

urlpatterns = [ 
    url(r'^$', BV, name='news'), 
    url(r'^user_login/', views.user_login, name='user_login'), 
    url(r'^user_logout/', views.user_logout, name='user_logout'), 
    url(r'^register/', views.register, name='register'), 

] 

base.html文件 polls.html

<form method="post" enctype="multipart/form-data" action="{% url 'user_login' %}">{% csrf_token %} 
<div class="loginWrapper"> 
     {{ form_login.username|placeholder:"username" }} 
     {{ form_login.password|placeholder:"password" }} 

     <input type="submit" value="login" style="margin-left: 10px"/> 
    </div> 
</form> 

<form method="post" enctype="multipart/form-data" action="{% url 'register' %}">{% csrf_token %} 
<div class="registerWrapper"> 
     {{ form.username|placeholder:"username" }} 
     {{ form.email|placeholder:"email" }} 
     {{ form.password|placeholder:"password" }} 
     {{ form.confirm_password|placeholder:"confirm password" }} 
     <input type="submit" value="register" /> 

    </div> 
</form> 

任何想法,我怎么能解决这个问题的家长吗?

回溯:

File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Users/zorgan/Desktop/app/draft1/draft1/views.py" in user_login 
    108.   login(request, user) 

File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/contrib/auth/__init__.py" in login 
    124.  request.session[SESSION_KEY] = user._meta.pk.value_to_string(user) 

File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/utils/functional.py" in inner 
    235.   return func(self._wrapped, *args) 

Exception Type: AttributeError at /user_login/ 
Exception Value: 'AnonymousUser' object has no attribute '_meta' 
+1

总是显示有问题的完整的错误信息(追溯) - 不仅是最后一行。可以有其他有用的信息。 – furas

+0

在我的编辑中添加。 – Zorgan

你在这里做了不少奇怪的事情。但眼前的问题是,你不检查验证是否真正成功。

user = authenticate(username=username, password=password) 
if user: 
    login(request, user) 
else: 
    # show an error 
+0

是的,这似乎是问题,谢谢。你还看到了什么其他“奇怪的东西”?我这样格式化视图的原因是因为我在主页上有登录和注册表单(可通过javascript onclick访问,以防止页面刷新)。所以登录/注册表单没有自己的URL。 – Zorgan

+0

主要是,如果验证失败,您不会返回带有errorsb的表单,但会在本地打印错误,然后创建一个新的空表单。 –