2016-12-24 41 views
0

因此,當我輸入正確的用戶名/密碼時,登錄工作正常。然而,當我輸入了不正確的用戶名或密碼,它返回此錯誤:當我使用不正確的憑據登錄時出現錯誤

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

回答

0

你在這裏做了不少奇怪的事情。但眼前的問題是,你不檢查驗證是否真正成功。

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

是的,這似乎是問題,謝謝。你還看到了什麼其他「奇怪的東西」?我這樣格式化視圖的原因是因爲我在主頁上有登錄和註冊表單(可通過javascript onclick訪問,以防止頁面刷新)。所以登錄/註冊表單沒有自己的URL。 – Zorgan

+0

主要是,如果驗證失敗,您不會返回帶有errorsb的表單,但會在本地打印錯誤,然後創建一個新的空表單。 –

相關問題