簡體   English   中英

object型無屬性認證

[英]Type object has no attribute authentication

我正在使用自定義表進行用戶登錄和注冊,但是由於未將數據與同一個用戶表匹配,我在登錄時遇到錯誤。

使用user = userInfo.authenticate(username=username,password=password)時出現錯誤

類型 object 'userInfo' 沒有屬性 'authenticate'。

同樣在注冊時,我正在通過“password = make_password(password1)”來加密密碼

這里我的代碼是:

我在設置文件中更改了用戶 model。

設置.py

AUTH_USER_MODEL = 'assets.userInfo'

模型.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"

視圖.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')  

對於注冊,它在數據庫中添加數據但不驗證登錄數據。

當您使用AbstractBaseUser class 自定義默認用戶 model 時,它將創建唯一提及字段,就像您提到的first_name, last_name, username, email,密碼, van, isActive, created_date

在這里你犯了一個錯誤是 Django 有自己的方式來創建密碼,我們只需要遵循那個特定的步驟

密碼由 Django 使用PermissionMixin管理,我們使用AbstractBaseUserAbstractUserUser任何用戶 擴展功能我們必須遵循密碼管理,這就是為什么我們能夠create user, set_password, authenticate login, logout, etc預定義方法,否則不能

因此,如果您使用AbstractBaseUserAbstractUserUser ,您也必須遵循任何用戶擴展功能也繼承處理所有身份驗證方法的PermissionMixin

看看更新的 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"

在視圖中,您可以訪問權限方法,例如


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

這是可能有助於用戶擴展此站點的鏈接將有助於學習簡單比復雜更好如果您有任何疑問,請在評論中告訴我

似乎您在注冊方法中缺少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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM