当非管理员用户登录时出现“AnonymousUser”错误 - Django

时间:2018-01-10 20:04:45

标签: python django django-models django-forms django-views

当我尝试登录通过AbstractBaseUser模型注册的用户时,我收到错误:

'AnonymousUser'对象没有属性'_meta'

其中突出显示了代码:

登录(请求,用户)

但是,如果用户是管理员,则没有问题,让我相信问题不在于'login_view',而是在注册用户时如何标记(可以这么说)使用AbstractBaseUser。

非常感谢任何帮助!

这是我的代码:

Models.py

from django.db import models
from django.contrib.auth.models import (
    AbstractBaseUser, BaseUserManager, PermissionsMixin
)

class UserManager(BaseUserManager):
    def create_user(self, first_name, last_name, email, password=None, is_active=True, is_staff=False, is_admin=False):
        if not first_name:
            raise ValueError("Users must enter their first name")

        if not last_name:
            raise ValueError("Users must enter their last name")

        if not email:
            raise ValueError("Users must enter an email")

        if not password:
            raise ValueError("Users must enter a password")

        user_obj = self.model(
            first_name = first_name,
            last_name = last_name,
            email = self.normalize_email(email),
        )
        user_obj.set_password(password) #set and change password?
        user_obj.admin = is_admin
        user_obj.staff = is_staff
        user_obj.active = is_active
        user_obj.save(using=self._db)
        return user_obj

    def create_superuser(self, first_name, last_name, email, password=None):
        user = self.create_user(
            first_name,
            last_name,
            email,
            password=password,
            is_staff=True,
            is_admin=True
        )
        return user

class User(AbstractBaseUser, PermissionsMixin):
    first_name = models.CharField(max_length=255, blank=True, null=True)
    last_name = models.CharField(max_length=255, blank=True, null=True)
    email = models.EmailField(max_length=255, unique=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    active = models.BooleanField(default=True) #can login
    staff = models.BooleanField(default=False) #staff not superuser
    admin = models.BooleanField(default=False) #superuser

    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = ['first_name', 'last_name']

    objects = UserManager()

    def __str__(self):
        return self.email

    def get_first_name(self):
        return self.email

    def get_last_name(self):
        return self.email


    def get_short_name(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active

Forms.py

from django import forms
from django.contrib.auth import (
    authenticate,
    get_user_model,
    login,
    logout,
    )
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.contrib.auth.models import User, Group

User = get_user_model()

class UserAdminCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

    def save(self, commit=True):
        user = super(UserAdminCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserAdminChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = User
        fields = ('email', 'first_name', 'last_name', 'password', 'admin')

    def clean_password(self):
        return self.initial["password"]

class LoginForm(forms.Form):
    username = forms.CharField(label='Email')
    password = forms.CharField(widget=forms.PasswordInput)

Views.py

from django.shortcuts import render
from django.contrib.auth.models import User, Group
from django.contrib.auth import (
    authenticate,
    get_user_model,
    login,
    logout,
    )
from django.shortcuts import redirect
from .forms import UserAdminCreationForm, LoginForm

def register_view(request):

    form = UserAdminCreationForm(request.POST or None)
    if form.is_valid():
        user = form.save(commit=False)
        password = form.cleaned_data.get('password')
        user.set_password(password)
        user.save()
        user.groups.add(Group.objects.get(name='customers'))
        login(request, user)

    context = {
        "form": form,
    }

    return render (request, "register.html", context)

def login_view(request):

    form = LoginForm(request.POST or None)
    if form.is_valid():
        username = form.cleaned_data.get("username")
        password = form.cleaned_data.get("password")
        user = authenticate(username=username, password=password)
        login(request, user)

    context = {
        "form": form,
    }

    return render (request, "login.html", context)

1 个答案:

答案 0 :(得分:0)

尝试使用BaseClass提供的方法。这样可以防止您发生意外错误。

您可以为此目的使用super()。