Сделать аутентификацию и вход в систему для нескольких таблиц, кроме таблицы auth User в django?

Я создал модель hostTable в приложении hostlogin и хочу использовать эту таблицу для входа в систему, для этого я создал пользовательскую функцию authenticate, потому что стандартная authenticate() работала только для таблицы пользователей auth. Также функция login() не прикрепляет текущую сессию к пользователям из hostTable. Хотя это работает нормально, если я устанавливаю AUTH_USER_MODEL ='hostlogin.HostTable', но тогда страница администратора не работает, и это не является приемлемым решением, потому что hostTable я буду использовать для входа преподавателей (127.0.0.1:8081/tlogin/) и studentlogin таблица я буду использовать для входа студентов (127. 0.0.1:8081/slogin/), то как я буду использовать две разные таблицы для разных login() и authenticate(), ни для одного из этих двух пользователей я не хочу предоставлять доступ администратора (127.0.0.1:8081/admin/), поэтому я не использую таблицу auth user.

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractUser,AbstractBaseUser,PermissionsMixin
from django.contrib.auth.hashers import make_password, check_password


class HostTable(AbstractBaseUser):
    pid=models.AutoField(primary_key=True,auto_created=True)
    username=models.CharField(max_length=50,unique=True)
    password=models.CharField(max_length=128)
    #...someotherfields...
    createdtime =models.DateTimeField(default=timezone.now)
    last_login=models.DateTimeField(default=timezone.now)
    is_authenticated=models.BooleanField(default=True)
    is_active   = models.BooleanField(default=True)
    is_staff    = models.BooleanField(default=False)
    USERNAME_FIELD = 'username'

    REQUIRED_FIELDS=['hostname','ownername','password']
    def save(self, *args, **kwargs):
        self.password = make_password(self.password)
        super(HostTable, self).save(*args, **kwargs)

    def __str__(self):
        return self.hostname
    

view.py


def hostlogin(request):
    if request.method == 'POST':
        form = UserLoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            print('view',username,password)
            user = hostTableAuth.authenticate(request,username,password)
            print('view',user)
            if user is not None:
                login(request,user)
                messages.success(request, f' welcome {username} !!')
                # print(request.META['REMOTE_USER'])
                print('r',request.user)
                print('r',request.user.is_authenticated)
                print('s',request.session)
                request.session['username']=username
                return redirect('home')
            else:
                messages.info(request, f'account done not exit plz sign in')
    form = UserLoginForm()
    return render(request, 'hostlogin/login.html', {'form':form, 'title':'log in'})

customeAuth.py

from django.contrib.auth.backends import BaseBackend,ModelBackend
from django.contrib.auth.hashers import check_password
from .models import HostTable


class hostTableAuth(ModelBackend):
      def authenticate(self, request,username, password):
        user=HostTable.objects.filter(username=username).first()
        print('user',username,password,user.password)
        if user is not None:
            login_valid = user.username == username
            pwd_valid = check_password(password, user.password)
            print(login_valid,pwd_valid)
            if login_valid and pwd_valid:
                try:
                    user = HostTable.objects.get(username=username)
                except HostTable.DoesNotExist:
                    # Create a new user. There's no need to set a password
                    # because only the password from settings.py is checked.
                    user = HostTable(username=username)
                    user.is_staff = True
                    user.is_superuser = True
                    user.save()
                print('auth1',user)
                return user
        else:
            print('auth2',user)

            return None

      def get_user(self, user_id):
        try:
            return HostTable.objects.get(pk=user_id)
        except HostTable.DoesNotExist:
            return None

enter image description here

Ваши модели похожи на :

forms.py :

from .models import User


class RegisterUser(forms.ModelForm):
    class Meta:
        model = User
        fields = ['phone', 'email', 'username', 'password', 'first_name', 'last_name']
        labels = {
            'password': 'Password',
        }
        widgets = {
            'email': forms.EmailInput(attrs={'class':'form-control my-5', 'placeholder':'example1234@gmail.com'}),
            'phone': forms.NumberInput(attrs={'class':'form-control my-5', 'placeholder':'09123456789'}),
            'username': forms.TextInput(attrs={'class':'form-control my-5', 'placeholder':'Username'}),
            'password': forms.PasswordInput(attrs={'class':'form-control my-5', 'placeholder':'••••••••••••'}),
            'first_name': forms.TextInput(attrs={'class':'form-control my-5', 'placeholder':'Ali'}),
            'last_name': forms.TextInput(attrs={'class':'form-control my-5', 'placeholder':'alizadeh'}),
            'role': forms.ChoiceWidget(attrs={'class':'form-control my-5'}),
        }

views.py :

def loginUser(request):
    if request.user.is_authenticated:
        messages.warning(request, 'شما نمیتوانید به این صفحه مراجعه کنید')
        return redirect('HOME')
    elif request.method == 'POST':
        phone = request.POST.get('phone')
        password = request.POST.get('password')
        
        user = auth.authenticate(request, phone=phone, password=password)
        
        if user is not None:
            auth.login(request, user)
            messages.success(request, 'خوش آمدید')
            return redirect('PROFILE')
        else:
            messages.error(request, 'مشخصات وارد شده اشتباه می باشد، دوباره تلاش کنید')
            return render(request, 'user/login.html')
    return render(request, "user/login.html")

def registerUser(request):
    if request.user.is_authenticated:
        messages.warning(request, 'شما نمیتوانید به این صفحه مراجعه کنید')
        return redirect('HOME')
    elif request.method == 'POST':
        form = RegisterUser(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            phone = form.cleaned_data['phone']
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            role = forms.cleaned_data['role']
            user = User.objects.create_user(email=email, username=username, password=password,first_name=first_name,role=role,
                                            last_name=last_name, phone=phone)
            user.set_password(password)
            user.is_active = True
            user.save()
            messages.success(request, 'اطلاعات شما با موفقیت ثبت گردید')
            return redirect('HOME')
        else:
            messages.error(request, f'{form.errors}')
            return redirect('REGISTER')
    else:
        form = RegisterUser()
    return render(request, "user/signup.html", {'form': form})

извините, из-за того, что я перс (иранец)... вы видите, что сообщения набраны персидскими словами :). Вы можете изменить их по своему усмотрению

Вернуться на верх