Не удается подтвердить подлинность пользовательского пользователя - PullRequest
0 голосов
/ 26 июня 2019

Я относительно новичок в Джанго. У меня есть веб-приложение (в работе), которое использует пользовательскую модель пользователя с именем User, которая затем наследуется 3 подклассами: Contractor, Supervisor и Client, что дает нам 3 типа пользователей. Я могу создать всех трех типов пользователей просто отлично, и я могу просматривать / редактировать / удалять их, используя сайт администратора просто отлично. Тем не мение. Когда я пытаюсь войти в систему как Клиент и Супервизор, используя их соответствующие учетные данные, я получаю неправильную ошибку электронной почты / пароля. Как ни странно, эта ошибка не возникает при входе в систему с электронной почтой / паролем Исполнителя. Я не могу понять , в чем проблема, поэтому я не могу действительно устранить неполадки. Было бы здорово, если бы кто-то мог указать на ошибку, которую я должен сделать.

models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser, AbstractBaseUser
from django_countries.fields import CountryField
from django.contrib.auth.base_user import BaseUserManager
from myproject import settings


# Create your models here.

class UserAccountManager(BaseUserManager):
    def create_user(self, email, password=None):
        if not email:
            raise ValueError('Email must be set!')
        user = self.model(email=self.normalize_email(email),
                          )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        user = self.create_user(email, password)
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using = self._db)
        return user

class User(AbstractBaseUser):
    email = models.EmailField(max_length=150, unique=True)
    is_client = models.BooleanField(default=False)
    is_contractor = models.BooleanField(default=False)
    is_supervisor = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    username = models.CharField(max_length=150, blank=True)
    is_superuser = True


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserAccountManager()

    def has_perm(self, perm, obj=None):
        return self.is_superuser

    def has_module_perms(self, users):
        return self.is_superuser

class Client(User):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, parent_link=True)
    name = models.CharField(max_length=150, verbose_name='Name')
    address_1 = models.CharField(max_length=150, verbose_name='Address')
    address_2 = models.CharField(max_length=150, blank=True, verbose_name='Address (#2)', null=True)
    country = CountryField()
    region = models.CharField(max_length=150, blank=True, verbose_name='Region')
    city = models.CharField(max_length=150, verbose_name='City')
    postal_code = models.CharField(max_length=150, verbose_name='Postal code')
    po_box_no = models.IntegerField(blank=True, verbose_name='P.O. Box no', null=True)
    landline_no = models.IntegerField(verbose_name='Landline number')
    mobile_no_1 = models.IntegerField(verbose_name='Mobile number')
    mobile_no_2 = models.IntegerField(blank=True, verbose_name='Mobile number (#2)', null=True)
    bank_name_1 = models.CharField(max_length=150, verbose_name="Bank name")
    bank_account_no_1 = models.CharField(max_length=150, verbose_name='Bank account number')
    bank_name_2 = models.CharField(max_length=150, blank=True, verbose_name="Bank name (#2)", null=True)
    bank_account_no_2 = models.CharField(max_length=150, blank=True, verbose_name = 'Bank account number (#2)', null=True)
    national_id = models.IntegerField(verbose_name='National I.D.')
    zip_code = models.IntegerField(verbose_name='ZIP Code', blank=True, null=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [
        'name', 'address_1', 'country', 'city', 'postal_code', 'landline_no', 'username',
        'mobile_no_1', 'bank_name_1', 'bank_account_no_1', 'national_id', 'zip_code',
        ]

    def __str__(self):
        return self.email


    class Meta:
        verbose_name = 'client'
        verbose_name_plural = 'clients'


class Contractor(User):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, parent_link=True)
    name = models.CharField(max_length=150, verbose_name='Name')
    address_1 = models.CharField(max_length=150, verbose_name='Address')
    address_2 = models.CharField(max_length=150, blank=True, verbose_name='Address (#2)', null=True)
    country = CountryField()
    region = models.CharField(max_length=150, blank=True, verbose_name='Region')
    city = models.CharField(max_length=150, verbose_name='City')
    postal_code = models.CharField(max_length=150, verbose_name='Postal code')
    po_box_no = models.IntegerField(blank=True, verbose_name='P.O. Box no', null=True)
    landline_no = models.IntegerField(verbose_name='Work phone number')
    mobile_no_1 = models.IntegerField(verbose_name='Mobile number')
    mobile_no_2 = models.IntegerField(blank=True, verbose_name='Mobile number (#2)', null=True)
    bank_name_1 = models.CharField(max_length=150, verbose_name="Bank name")
    bank_account_no_1 = models.CharField(max_length=150, verbose_name='Bank account number')
    bank_name_2 = models.CharField(max_length=150, blank=True, verbose_name="Bank name (#2)", null=True)
    bank_account_no_2 = models.CharField(max_length=150, blank=True, verbose_name = 'Bank account number (#2)', null=True)
    national_id = models.IntegerField(verbose_name='National I.D.')
    zip_code = models.IntegerField(verbose_name='ZIP Code', blank=True, null=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [
        'name', 'address_1', 'country', 'city', 'postal_code', 'landline_no', 'username',
        'mobile_no_1', 'bank_name_1', 'bank_account_no_1', 'national_id', 'zip_code',
        ]

    def __str__(self):
        return self.email

    class Meta:
        verbose_name = 'contractor'
        verbose_name_plural = 'contractors'

class Supervisor(User):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, parent_link=True)
    name = models.CharField(max_length=150, verbose_name='Name')
    address_1 = models.CharField(max_length=150, verbose_name='Address')
    address_2 = models.CharField(max_length=150, blank=True, verbose_name='Address (#2)', null=True)
    country = CountryField()
    region = models.CharField(max_length=150, blank=True, verbose_name='Region')
    city = models.CharField(max_length=150, verbose_name='City')
    postal_code = models.CharField(max_length=150, verbose_name='Postal code')
    po_box_no = models.IntegerField(blank=True, verbose_name='P.O. Box no', null=True)
    landline_no = models.IntegerField(verbose_name='Work number')
    mobile_no_1 = models.IntegerField(verbose_name='Mobile number')
    mobile_no_2 = models.IntegerField(blank=True, verbose_name='Mobile number (#2)', null=True)
    bank_name_1 = models.CharField(max_length=150, verbose_name="Bank name")
    bank_account_no_1 = models.CharField(max_length=150, verbose_name='Bank account number')
    bank_name_2 = models.CharField(max_length=150, blank=True, verbose_name="Bank name (#2)", null=True)
    bank_account_no_2 = models.CharField(max_length=150, blank=True, verbose_name = 'Bank account number (#2)', null=True)
    national_id = models.IntegerField(verbose_name='National I.D.')
    zip_code = models.IntegerField(verbose_name='ZIP Code', blank=True, null=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [
        'name', 'address_1', 'country', 'city', 'postal_code', 'landline_no', 'username',
        'mobile_no_1', 'bank_name_1', 'bank_account_no_1', 'national_id', 'zip_code',
        ]

    def __str__(self):
        return self.email

    class Meta:
        verbose_name = 'supervisor'
        verbose_name_plural = 'supervisors'

views.py:

    # Create your views here.

    from django.shortcuts import render

    from django.contrib.auth import login
    from django.shortcuts import redirect
    from django.views.generic import CreateView


    from .forms import ClientSignUp, ContractorSignUp, SupervisorSignUp
    from .models import Client, Contractor, Supervisor
    from decorators import *

    from django.utils.decorators import method_decorator
    from django.contrib.auth.decorators import login_required


    class ClientSignUpView(CreateView):
        model = Client
        form_class = ClientSignUp
        template_name = 'registration/signup_form.html'

        def get_context_data(self, **kwargs):
            kwargs['user_type'] = 'client'
            return super().get_context_data(**kwargs)

        def form_valid(self, form):
            user = form.save()
            user.set_password('raw_password')
            user.save()
            login(self.request, user)
            return redirect('accounts/profile')



    class ContractorSignUpView(CreateView):
        model = Contractor
        form_class = ContractorSignUp
        template_name = 'registration/signup_form.html'

        def get_context_data(self, **kwargs):
            kwargs['user_type'] = 'contractor'
            return super().get_context_data(**kwargs)

        def form_valid(self, form):
            user = form.save()
            user.save()
            user.set_password('raw_password')
            login(self.request, user)
            return redirect('accounts/profile')

    class SupervisorSignUpView(CreateView):
        model = Supervisor
        form_class = SupervisorSignUp
        template_name = 'registration/signup_form.html'

        def get_context_data(self, **kwargs):
            kwargs['user_type'] = 'supervisor'
            return super().get_context_data(**kwargs)

        def form_valid(self, form):
            if form.is_valid():
                user = form.save()
                user.set_password('raw_password')
                user.save()
                login(self.request, user)
                return redirect('accounts/profile')

EmailBackend.py:

    from django.contrib.auth.backends import ModelBackend
    from users.models import User

    class Email_backend(object):
        def authenticate(self, username=None, password=None):
            try:
                user=User.objects.get(email=username)
            except User.DoesNotExist:
                return None

            if check_password(password, user.password):
                return user
            return None

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

login.html:

    {% extends 'base.html' %}

{% block title %}Login{% endblock %}

{% block content %}
  <h2>Login</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
  </form>

{% endblock %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...