質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

511閲覧

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

yuuki01010101

総合スコア1

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/01/01 07:09

前提

プログラミング初心者で、現在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/ツールのバージョンなど)

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

django-role-permissions とかで出来そうじゃないですか?

Djangoにおけるアクセス制御の話

https://hironsan.hatenablog.com/entry/django-access-control

投稿2023/01/01 07:50

yuma.inaura

総合スコア1453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuki01010101

2023/01/03 11:28

ありがとうございます! 試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問