【Django】ユーザーアカウントを複数作成したい

前提

プログラミング初心者で、現在Djangoを勉強中です。
まだ理解できていない部分が多く解決不明なため質問させていただきます。

実現したいこと

2種類のユーザーアカウントを管理したいのですが、可能なのでしょうか?
例えば、学生アカウントと教員アカウントのような複数のアカウントを管理し、アカウントの種類によって表示する画面を変えたいと思っています。

admin上も1つaccountsのカテゴリーの中で学生アカウントと教員アカウントを管理したいと思っています。

発生している問題・エラーメッセージ

別クラスでPermissionsMixinを2つも継承するとエラーになってしまったので、ユーザー名とパスワードなどの共通部分はBaseAccountクラスを作成し、学生のクラスと教員のクラスがBaseAccountを継承する形で作成しようとしたのですができませんでした。

不明点が言語化できてない部分があり、分かりにくいと思いますがアドバイスをお願いします。

該当のソースコード

from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.db import models from django.core.validators import MinLengthValidator, RegexValidator from django.core.mail import send_mail from django.utils.translation import gettext_lazy as _ from django.conf import settings class UserAccountManager(BaseUserManager): use_in_migrations = True #CreateAccountベース def _create_user(self, username, email, password, **extra_fields): if not username: raise ValueError('ユーザー名を設定してください') email = self.normalize_email(email) username = self.model.normalize_username(username) user = self.model(username=username, email=email, **extra_fields) user.set_password(password) user.save(using=self._db) return user #ユーザーアカウント作成 def create_user(self, username, email=None, password=None, **extra_fields): extra_fields.setdefault('is_staff', False) extra_fields.setdefault('is_superuser', False) return self._create_user(username, email, password, **extra_fields) #スタッフアカウント作成 def create_superuser(self, username, email=None, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) if extra_fields.get('is_staff') is not True: raise ValueError('Superuser must have is_staff=True.') if extra_fields.get('is_superuser') is not True: raise ValueError('Superuser must have is_superuser=True.') return self._create_user(username, email, password, **extra_fields) class BaseAccount(AbstractBaseUser, PermissionsMixin): username = models.CharField(verbose_name='ユーザーネーム', max_length=20, unique=True, null=True, validators=[MinLengthValidator(5), RegexValidator(r'^[a-zA-Z0-9]*$',)]) email = models.EmailField(verbose_name='メールアドレス', max_length=50, unique=True) last_name = models.CharField(verbose_name='姓', max_length=10) first_name = models.CharField(verbose_name='名', max_length=10) birthday = models.DateField(verbose_name="生年月日", blank=True, null=True) address = models.CharField(verbose_name='住所', max_length=100, blank=True, null=True) phone_number = models.CharField(verbose_name='電話番号', max_length=15, blank=True, null=True) image = models.ImageField(verbose_name='プロフィール画像', upload_to="image/", blank=True, null=True) created_date = models.DateTimeField(verbose_name='登録日', auto_now_add=True, editable=True) is_active = models.BooleanField(verbose_name='ログイン可否', default=True) is_staff = models.BooleanField(verbose_name='スタッフ権限', default=False) is_superuser = models.BooleanField(verbose_name='管理者権限', default=True) account_stop = models.BooleanField(verbose_name='アカウント停止', default=False) objects = UserAccountManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['email','last_name','first_name' ] class Meta: verbose_name = _('bas') verbose_name_plural = 'アカウント' def __str__(self): return self.username class UserAccount(models.Model): users = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='users', on_delete=models.CASCADE, default=1) username = models.CharField(verbose_name='ユーザーネーム', max_length=20, unique=True, null=True, validators=[MinLengthValidator(5), RegexValidator(r'^[a-zA-Z0-9]*$',)]) title = models.CharField(blank=False, null=False, max_length=150) USER_RANK = [ ('高', '高'), ('中', '中'), ('低', '低'), ] importance_rank = models.TextField(verbose_name='優先度', choices=USER_RANK, blank=True, null=False) # objects = UserAccountManager() class Meta: verbose_name = _('user') verbose_name_plural = '学生アカウント' def __str__(self): return self.title class LawyerAccount(models.Model): lawyer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='lawyer', on_delete=models.CASCADE, default=1) username = models.CharField(verbose_name='ユーザーネーム', max_length=20, unique=True, null=True, validators=[MinLengthValidator(5), RegexValidator(r'^[a-zA-Z0-9]*$',)]) registration_number = models.CharField(verbose_name='番号', max_length=50, blank=False, null=False) office_name = models.CharField(verbose_name='学校名', max_length=50, blank=True, null=True) office_address = models.CharField(verbose_name='住所', max_length=100, blank=True, null=True) BELONGS_NAME = [ ('1', '東京'), ('2', '大阪'), ('3', '福岡'), ] GENDER_CATEGRY = [ ('男','男'), ('女','女'), ] gender = models.TextField(verbose_name='性別', choices=GENDER_CATEGRY, blank=True, null=False) belong_name = models.TextField(verbose_name='所属', choices=BELONGS_NAME, blank=True, null=False) # objects = UserAccountManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['username','','email','last_name','first_name','gender','belong_name','office_name','office_address'] related_name="lawyer", class Meta: verbose_name = _('lawyer-user') verbose_name_plural = '教員アカウント' def __str__(self): return self.registration_number

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

コメントを投稿

0 コメント