Привет У меня проблемы с настройкой аутентификации в Django

Я новичок и разрабатываю программное обеспечение для аутентификации на Django. Моя проблема в том, что мне нужно проверить четыре отдельных уровня, для которых есть предопределенные коды в проверке прав. Класс модели под названием провинция, класс модели под названием город и модель под названием студент. Моя модель проверки такова, что я должен иметь возможность дать пользователю членство в центральном офисе или членство в провинции или членство в городе в провинции. Пользователь может быть только в одной из этих ситуаций

Мои модели выглядят следующим образом

class Province(models.Model):
    province_id = models.IntegerField(primary_key=True, serialize=True, verbose_name='ID')
    province_title = models.CharField(max_length=30, verbose_name=_('Province'))

    class Meta:
        ordering = ['province_id']

    def __str__(self):
        return self.province_title

class Center(models.Model):
    id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
    center_title = models.CharField(max_length=150, verbose_name=_('Name of the training center'), null=True)
    center_title_id = models.CharField(max_length=64, verbose_name=_('Code of the training center'), null=True)
    province = models.ForeignKey(Province, on_delete=models.CASCADE, verbose_name=_('Province'))

    class Meta:
        verbose_name = _("center")
        verbose_name_plural = _("centers")

    def __str__(self):
        return self.center_title`

class CulturalUser(AbstractUser):
    pass

class UserPositions(models.Model):
    class Position(models.TextChoices):
        UNIVERSITY_STUDENT = '1', _('University student')
        TRAINING_CENTER = '2', _('Training center')
        PROVINCE = '3', _('Province')
        CENTRAL_OFFICE = '4', _('Central office')

    user = models.ForeignKey(CulturalUser, on_delete=models.CASCADE, verbose_name=_('User'))
    position = models.CharField(max_length=2, verbose_name=_('Access level'), choices=Position.choices,
                                default=Position.UNIVERSITY_STUDENT)
    province = models.ForeignKey(Province, on_delete=models.SET_NULL, blank=True, null=True)
    center = models.ForeignKey(Center, on_delete=models.SET_NULL, blank=True, null=True)

    def __str__(self):
        return self.position

пожалуйста, направьте меня

После проведенного поиска я не смог найти нужные источники в режиме вопроса

Вы можете либо расширить, либо заменить пользовательскую модель. Цитируя документацию:

Если вы начинаете новый проект, настоятельно рекомендуется установить пользовательскую модель пользователя, даже если вам достаточно модели пользователя по умолчанию. Эта модель ведет себя идентично модели пользователя по умолчанию, но вы сможете настроить ее в будущем, если возникнет такая необходимость:

Полный пример

Пользовательские модели в Django считаются с разрешениями и авторизацией и группами из коробки. Таким образом, вместо полей выбора у вас будет четыре группы, для которых вы будете обрабатывать доступ с помощью разрешений.

  • Студент университета
  • Учебный центр
  • Провинция
  • Центральный офис

Вот одна из версий вашей модели:

from django.utils.translation import gettext_lazy as _
from django.db import models
from django.contrib.auth.models import AbstractUser


class Province(models.Model):
    name = models.CharField(
        max_length=30, 
        verbose_name=_('Province')
    )

    class Meta:
        ordering = ['id']

    def __str__(self):
        return self.title


class Center(models.Model):
    name = models.CharField(
        max_length=150, 
        verbose_name=_('Name of the training center'), 
        null=True,
    )
    code = models.CharField(
        max_length=64, 
        verbose_name=_('Code of the training center'),
        null=True,
    )
    province = models.ForeignKey(
        Province, 
        on_delete=models.CASCADE, 
        verbose_name=_('Province')
    )

    class Meta:
        verbose_name = _("center")
        verbose_name_plural = _("centers")

    def __str__(self):
        return self.name


class User(AbstractUser):
    province = models.ForeignKey(
        Province, 
        on_delete=models.SET_NULL, 
        blank=True, null=True,
    )

    center = models.ForeignKey(
        Center, 
        on_delete=models.SET_NULL, 
        blank=True, null=True,
    )
    
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

Обратите внимание, что я использовал AbstractUser, как и вы, но вы можете сделать еще более глубокую настройку с помощью AbstractBaseUser, как показано в примере, на который я ссылался выше.

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