Python 键入对象';用户信息';没有属性';验证';-不同用户表django中的登录身份验证

Python 键入对象';用户信息';没有属性';验证';-不同用户表django中的登录身份验证,python,django,pgadmin,Python,Django,Pgadmin,我正在使用自定义表来登录和注册用户,但由于未将数据与同一用户表匹配,我在登录时出错 使用user=userInfo.authenticate(username=username,password=password) 我发现类型对象“userInfo”没有属性“authenticate”时出错。 在注册时,我还通过“password=make_password(password1)”加密密码 我的代码是: 我已更改设置文件中的用户模型 设置.py AUTH_USER_MODEL = 'assets

我正在使用自定义表来登录和注册用户,但由于未将数据与同一用户表匹配,我在登录时出错

使用
user=userInfo.authenticate(username=username,password=password)
我发现
类型对象“userInfo”没有属性“authenticate”时出错。

在注册时,我还通过“password=make_password(password1)”加密密码

我的代码是:

我已更改设置文件中的用户模型

设置.py

AUTH_USER_MODEL = 'assets.userInfo'
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager ,UserManager


class userInfo(AbstractBaseUser): 
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    username = models.CharField(max_length=200)
    email = models.EmailField(max_length=200,verbose_name="email" , unique=True)
    password = models.CharField(max_length=200)
    abn = models.CharField(max_length=200)
    password = models.CharField(max_length=200) 
    isActive = models.BooleanField(default=True) 
    created_date = models.DateTimeField(default=timezone.now)

    REQUIRED_FIELDS =['username']
    USERNAME_FIELD = 'email'
    objects = UserManager()
    class Meta:
       db_table="userInfo"
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate
from django.contrib.auth.models import User , auth 
from django.contrib import messages
from .models import userInfo , sector ,companyInfo ,capability , saleStages ,companySaleStages
from django.contrib.auth.hashers import make_password  
from .forms import CompanyDataForm
# Create your views here.  

def register(request):

    if request.method == 'POST':
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        username = request.POST['username']
        password1 = request.POST['password1']
        password2 = request.POST['password2']
        abn = request.POST['abn']
        email = request.POST['email']

        if password1==password2:
            if userInfo.objects.filter(username=username).exists():
                messages.info(request,'Username Taken')
                return redirect('register')
            elif userInfo.objects.filter(email=email).exists():
                messages.info(request,'Email Taken')
                return redirect('register')
            elif userInfo.objects.filter(abn=abn).exists():
                messages.info(request,'ABN Number Taken')
                return redirect('register')
            else:   
                user = userInfo.objects.create(username=username, password=make_password(password1), email=email,first_name=first_name,last_name=last_name,abn=abn)
                user.save()
                # user.id();  Foo.objects.latest('id')
                print('user created')
              #  return redirect('register')
                return redirect('sector')

        else:
            messages.info(request,'password not matching..')    
            return redirect('register')
        return redirect('/')
        
    else:
        return render(request,'assets/register.html')

def login(request):
    if request.method== 'POST':
        username = request.POST['username']
        password = request.POST['password']

        user = userInfo.authenticate(username=username,password=password)

        if user is not None:
            auth.login(request, user)
            return redirect("/")
        else:
            messages.info(request,'invalid credentials')
            return redirect('login')

    else:
        return render(request,'assets/login.html')  
型号.py

AUTH_USER_MODEL = 'assets.userInfo'
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager ,UserManager


class userInfo(AbstractBaseUser): 
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    username = models.CharField(max_length=200)
    email = models.EmailField(max_length=200,verbose_name="email" , unique=True)
    password = models.CharField(max_length=200)
    abn = models.CharField(max_length=200)
    password = models.CharField(max_length=200) 
    isActive = models.BooleanField(default=True) 
    created_date = models.DateTimeField(default=timezone.now)

    REQUIRED_FIELDS =['username']
    USERNAME_FIELD = 'email'
    objects = UserManager()
    class Meta:
       db_table="userInfo"
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate
from django.contrib.auth.models import User , auth 
from django.contrib import messages
from .models import userInfo , sector ,companyInfo ,capability , saleStages ,companySaleStages
from django.contrib.auth.hashers import make_password  
from .forms import CompanyDataForm
# Create your views here.  

def register(request):

    if request.method == 'POST':
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        username = request.POST['username']
        password1 = request.POST['password1']
        password2 = request.POST['password2']
        abn = request.POST['abn']
        email = request.POST['email']

        if password1==password2:
            if userInfo.objects.filter(username=username).exists():
                messages.info(request,'Username Taken')
                return redirect('register')
            elif userInfo.objects.filter(email=email).exists():
                messages.info(request,'Email Taken')
                return redirect('register')
            elif userInfo.objects.filter(abn=abn).exists():
                messages.info(request,'ABN Number Taken')
                return redirect('register')
            else:   
                user = userInfo.objects.create(username=username, password=make_password(password1), email=email,first_name=first_name,last_name=last_name,abn=abn)
                user.save()
                # user.id();  Foo.objects.latest('id')
                print('user created')
              #  return redirect('register')
                return redirect('sector')

        else:
            messages.info(request,'password not matching..')    
            return redirect('register')
        return redirect('/')
        
    else:
        return render(request,'assets/register.html')

def login(request):
    if request.method== 'POST':
        username = request.POST['username']
        password = request.POST['password']

        user = userInfo.authenticate(username=username,password=password)

        if user is not None:
            auth.login(request, user)
            return redirect("/")
        else:
            messages.info(request,'invalid credentials')
            return redirect('login')

    else:
        return render(request,'assets/login.html')  
视图.py

AUTH_USER_MODEL = 'assets.userInfo'
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager ,UserManager


class userInfo(AbstractBaseUser): 
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    username = models.CharField(max_length=200)
    email = models.EmailField(max_length=200,verbose_name="email" , unique=True)
    password = models.CharField(max_length=200)
    abn = models.CharField(max_length=200)
    password = models.CharField(max_length=200) 
    isActive = models.BooleanField(default=True) 
    created_date = models.DateTimeField(default=timezone.now)

    REQUIRED_FIELDS =['username']
    USERNAME_FIELD = 'email'
    objects = UserManager()
    class Meta:
       db_table="userInfo"
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate
from django.contrib.auth.models import User , auth 
from django.contrib import messages
from .models import userInfo , sector ,companyInfo ,capability , saleStages ,companySaleStages
from django.contrib.auth.hashers import make_password  
from .forms import CompanyDataForm
# Create your views here.  

def register(request):

    if request.method == 'POST':
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        username = request.POST['username']
        password1 = request.POST['password1']
        password2 = request.POST['password2']
        abn = request.POST['abn']
        email = request.POST['email']

        if password1==password2:
            if userInfo.objects.filter(username=username).exists():
                messages.info(request,'Username Taken')
                return redirect('register')
            elif userInfo.objects.filter(email=email).exists():
                messages.info(request,'Email Taken')
                return redirect('register')
            elif userInfo.objects.filter(abn=abn).exists():
                messages.info(request,'ABN Number Taken')
                return redirect('register')
            else:   
                user = userInfo.objects.create(username=username, password=make_password(password1), email=email,first_name=first_name,last_name=last_name,abn=abn)
                user.save()
                # user.id();  Foo.objects.latest('id')
                print('user created')
              #  return redirect('register')
                return redirect('sector')

        else:
            messages.info(request,'password not matching..')    
            return redirect('register')
        return redirect('/')
        
    else:
        return render(request,'assets/register.html')

def login(request):
    if request.method== 'POST':
        username = request.POST['username']
        password = request.POST['password']

        user = userInfo.authenticate(username=username,password=password)

        if user is not None:
            auth.login(request, user)
            return redirect("/")
        else:
            messages.info(request,'invalid credentials')
            return redirect('login')

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

注册时在数据库中添加数据,但不验证登录数据。

似乎您缺少
user=userInfo.authenticate(username=username,password=password)
用于注册方法中的身份验证。示例代码:

def login(request):
    if request.method == 'POST':
        if request.is_ajax():
            username = request.POST.get('username', '')
            password = request.POST.get('password', '')

            user = authenticate(request, username=username, password=password)

            if user is not None:
                auth_login(request, user)
                response_data = {
                    'success': True
                }
            else:
                response_data = {
                    'success': False
                }
            return JsonResponse(response_data)
    else:
        return redirect('pages:home')

当您使用
AbstractBaseUser
类自定义默认用户模型时,它将创建唯一的提及字段,就像您提到的
名字、姓氏、用户名、电子邮件、
密码、van、isActive、created\u date

这里您犯了一个错误,Django有自己的方法来创建密码,我们只需遵循特定的步骤

Django使用
PermissionMixin
管理密码,我们使用
AbstractBaseUser
AbstractUser
User
任何用户扩展功能我们必须遵循密码管理
以及为什么我们能够
创建用户、设置密码、验证登录、注销、,etc
预定义方法,否则

因此,如果您使用了
AbstractBaseUser
AbstractUser
User
任何用户扩展功能也继承了处理所有身份验证方法的
PermissionMixin
,那么这里您也必须遵循

更新模型并导入以下类或方法

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager ,UserManager, PermissionsMixin
from django.conf import settings

# Create UserProfileManager using BaseUserManager because if we added a new field in the user model we have to assign create time as well

# manager
class UserProfileManager(BaseUserManager):
    """ Model Manager for Profiles """

    def create_user(self,email,name,password=None):
        """ Create new user Profile """

        if not email:
            raise ValueError('User must have an email address');

        email = self.normalize_email(email)
        user  = self.model(email=email,name=name)

        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self,email,name,password):
        """ Create new super user for system """

        user = self.create_user(email,name,password)

        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)

        return user

# model
class userInfo(AbstractBaseUser,PermissionsMixin): 
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    username = models.CharField(max_length=200)
    email = models.EmailField(max_length=200,verbose_name="email" , unique=True)
    # password = models.CharField(max_length=200) remove password it's created auto by Django so we don't need to add over here
    abn = models.CharField(max_length=200)
    # password = models.CharField(max_length=200) if you want to confirm password do it frontend side don't overhere because it will create extra field
    isActive = models.BooleanField(default=True) 
    created_date = models.DateTimeField(default=timezone.now)

    REQUIRED_FIELDS =['username']
    USERNAME_FIELD = 'email'
    objects = UserProfileManager() 
    class Meta:
       db_table="userInfo"
在视图中,您可以访问权限方法,如


def register(request):

    if request.method == 'POST':
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        username = request.POST['username']
        password1 = request.POST['password1']
        password2 = request.POST['password2']
        abn = request.POST['abn']
        email = request.POST['email']

        if password1==password2:
            if userInfo.objects.filter(username=username).exists():
                messages.info(request,'Username Taken')
                return redirect('register')
            elif userInfo.objects.filter(email=email).exists():
                messages.info(request,'Email Taken')
                return redirect('register')
            elif userInfo.objects.filter(abn=abn).exists():
                messages.info(request,'ABN Number Taken')
                return redirect('register')
            else:   
                user = userInfo.objects.create(username=username,email=email,first_name=first_name,last_name=last_name,abn=abn)
                user.set_password(password1) # using this method you will assing hashed password
                user.save()
                # user.id();  Foo.objects.latest('id')
                print('user created')
              #  return redirect('register')
                return redirect('sector')

        else:
            messages.info(request,'password not matching..')    
            return redirect('register')
        return redirect('/')
        
    else:
        return render(request,'assets/register.html')

def login(request):
    if request.method== 'POST':
        username = request.POST['username']
        password = request.POST['password']

        user = authenticate(username=username,password=password)

        if user is not None:
            auth.login(request, user)
            return redirect("/")
        else:
            messages.info(request,'invalid credentials')
            return redirect('login')

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

这是一个链接,它可能会帮助这个网站从很多方面了解简单比复杂如果你有任何疑问请在评论中告诉我这
userInfo.authenticate
方法来自哪里?@IainShelvington我想它必须是authenticate(请求,用户名=用户名,密码=密码)我认为您应该使用
django.contrib.auth
中的
authenticate
方法。用户对象没有任何这样的方法。参考:我在用它,但它不起作用,你确定吗<代码>验证
,而不是
创建
女孩,这是验证,仍然不能解决您的问题?我想您是在userInfo中自定义authenticate方法,对吗?如果没有,您应该使用
user=authenticate(request,username=username,password=password)
来代替。调试此功能的最佳方法是覆盖那些被调用以检查cred的函数,并验证它们是否匹配。在您的例子中,django.contrib.auth的authenticate函数调用authentication\u BACKENDS中提到的每个后端类的authentication函数,如果该后端中的任何一个找到了用户,则返回user。所以这些函数首先通过用户名字段获取用户,然后检查密码。为了密码匹配,他们调用user.check\u password(),它位于AbstractBaseUser中。所以重写它并验证密码是否匹配。阅读所有函数以了解过程。