0

我为我的网站制作了一个自定义用户模型。我使用 AbstractBaseUser 制作模型并在设置中进行设置。用户和超级用户的创建工作正常,没有任何问题,超级用户也可以从管理页面登录。但是,当我试图让普通用户登录网站时,返回用户无。但是普通用户存在于数据库中。由于我使用了 AbstractBaseUser,因此我正在使用身份验证进行用户登录。我无法理解为什么会说用户不存在。如果我写了一些错误的代码,请纠正我。

models.py (自定义用户模型),这里 is_active 是 false 但我在 regd 之后手动激活它所以问题不是因为这个


class CustomUser(AbstractBaseUser, PermissionsMixin):
    
    email = models.EmailField( unique= True)
    full_name = models.CharField(max_length=255)
    phone_no = models.CharField(max_length=10, blank= True)
    address = models.CharField(max_length=500, blank= True)
    plan = models.CharField(max_length=255, blank= True)
    age = models.CharField(max_length=2, blank= True)

    date_joined = models.DateTimeField(default=timezone.now)




    is_staff = models.BooleanField( default=False)
    is_active = models.BooleanField( default=False)

    objects = CustomUserManager()


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['full_name']


    def __str__(self):
        return self.email

manager.py(自定义用户模型管理器)

class CustomUserManager(BaseUserManager):

    # CUSTOM USER MODEL FOR USER WHERE EMAIL IS THE USERNAME FOR AUTHENTICATION RATHER THEN USERNAME

    
    
    def create_superuser(self, email, full_name, password, **other_fields):

    # CREATE AND SAVE SUPERUSER WITH THE GIVEN EMAIL AND PASSWORD

        other_fields.setdefault('is_staff', True)
        other_fields.setdefault('is_superuser', True)
        other_fields.setdefault('is_active', True)

        if other_fields.get('is_staff') is not True:
            raise ValueError(_('is staff must be set to true'))
        
        if other_fields.get('is_superuser') is not True:
            raise ValueError(_('is superuser must be set to true'))
        
        return self.create_user(email, full_name, password, **other_fields)

    
    def create_user(self, email,full_name, password, **other_fields):

    # CREATE AND SAVE USER WITH THE GIVEN EMAIL AND PASSWORD

        if not email:
            raise ValueError(_('The Email must be set'))
        
        email = self.normalize_email(email)
        user = self.model(email=email, full_name=full_name,**other_fields)
        user.set_password(password)
        user.save()
        return user

设置.py

AUTH_USER_MODEL = 'account.CustomUser'

views.py(处理登录和用户创建的函数)

def registerpage(request):

    if request.method == 'POST':
        full_name = request.POST['full_name']
        age = request.POST['age']
        phone_no = request.POST['phone']
        address = request.POST['address']
        plan = request.POST['plan']
        email = request.POST['email']
        password1= request.POST['password']
        password2= request.POST['con_password']

        if password1==password2:
            user=CustomUser.objects.create_user(full_name=full_name,age=age, phone_no=phone_no, address=address, plan=plan, email=email, password=password1)
            user.save()
            print('user created')
            return redirect('login')
    else:
        return render(request, 'register.html')

def loginpage(request):

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('paswword')

        # user = CustomUser.objects.get(email=username, password=password)
        
        user = authenticate(request, email=username, password=password)

        if user is not None:
            login(request, user)
            return redirect(user_page) # this is in home views
        else:
            return HttpResponse(' User doesnt exist')               #FOR ERROR PURPOSE

    else:
        return render(request, 'login.html')



def t_and_c(request):
    return render(request, 'terms_and_condition.html')

这是我第一次使用自定义模型,所以我不知道我是否使用正确的方式登录用户。如果我错了,请纠正我。

4

1 回答 1

1

您有此错误是因为您在模型中默认没有activate用户(is_active=False )。CustomUser

我还看到您没有激活新用户的视图。那么你需要做的是在创建时激活用户(registerpage):

def registerpage(request):
    # Lot of code
    if password1==password2:
        user=CustomUser.objects.create_user(...)

        # You don't need to call save, as create_user do it already
        # user.save()

        # Now active the user
        user.is_active = True
        user.save()  # Here save() is necessary
       

更多关于Django 用户模型

更新 :

在您设置的自定义管理器中,USERNAME_FIELD = 'email' 这意味着您需要提供emailpassword登录。

def loginpage(request):

    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('paswword')
        
        # Use eamail to authenticate instead of username
        user = authenticate(request, email=email, password=password)
于 2021-11-19T12:33:04.160 回答