简体   繁体   English

object型无属性认证

[英]Type object has no attribute authentication

I am using custom table for login and registration of user, But I am getting error in login for not matching data with same table of user.我正在使用自定义表进行用户登录和注册,但是由于未将数据与同一个用户表匹配,我在登录时遇到错误。

While using user = userInfo.authenticate(username=username,password=password) I am getting error for使用user = userInfo.authenticate(username=username,password=password)时出现错误

type object 'userInfo' has no attribute 'authenticate'.类型 object 'userInfo' 没有属性 'authenticate'。

Also while registering i am encripting password by, "password=make_password(password1)"同样在注册时,我正在通过“password = make_password(password1)”来加密密码

Here my code is:这里我的代码是:

I have changed user model in settings file.我在设置文件中更改了用户 model。

settings.py设置.py

AUTH_USER_MODEL = 'assets.userInfo'

models.py模型.py

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"

views.py视图.py

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')  

For registration its adding data in database but not authenticating data for login.对于注册,它在数据库中添加数据但不验证登录数据。

When you used the AbstractBaseUser class to customize the default user model it will create the only mention field like you had mentioned first_name, last_name, username, email, password , van, isActive, created_date当您使用AbstractBaseUser class 自定义默认用户 model 时,它将创建唯一提及字段,就像您提到的first_name, last_name, username, email,密码, van, isActive, created_date

Here you had made mistake is Django has its own way to create password we have to follow only that specific step在这里你犯了一个错误是 Django 有自己的方式来创建密码,我们只需要遵循那个特定的步骤

password manage by Django using PermissionMixin and we are used AbstractBaseUser , AbstractUser or User any user Extending feature we must follow password management and that why we are able to create user, set_password, authenticate login, logout, etc predefined methods otherwise not密码由 Django 使用PermissionMixin管理,我们使用AbstractBaseUserAbstractUserUser任何用户 扩展功能我们必须遵循密码管理,这就是为什么我们能够create user, set_password, authenticate login, logout, etc预定义方法,否则不能

So here you have to follow as well if you used AbstractBaseUser , AbstractUser or User any user Extending feature also inherit PermissionMixin that handles all authentication method因此,如果您使用AbstractBaseUserAbstractUserUser ,您也必须遵循任何用户扩展功能也继承处理所有身份验证方法的PermissionMixin

have look updated model is and import following classes or methods,看看更新的 model 是并导入以下类或方法,

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"

In View, You can able to access the permission method like在视图中,您可以访问权限方法,例如


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')  

Here is link which might help User extending this site will help alot from learn simple is better then complex If you have any query let me know in comment这是可能有助于用户扩展此站点的链接将有助于学习简单比复杂更好如果您有任何疑问,请在评论中告诉我

Seem you are missing user = userInfo.authenticate(username=username, password=password) for authentication in the register method.似乎您在注册方法中缺少user = userInfo.authenticate(username=username, password=password)进行身份验证。 Example code:示例代码:

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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM