実現したいこと
1.django-rest-authを用いて、ユーザー認証を行う。
2.djangoから提供されているユーザーではなく(管理画面等で認証に使われるスーパーユーザーのことです)、models.pyでオブジェクトとして作った(((models.Models))を用いて作ったという意味です)を用いて、ユーザー認証を行う。
####環境
django : 3.1
djangorestframework:3.11.1
python : 3.7.6
背景
現在、ユーザー間で物々交換をできるアプリを作成しようとしています。そして、バックエンドでDjango, フロントエンドでReactを使って開発を進めています。
ユーザー登録機能、ユーザーログイン機能を実装したいと思い、DjangoでUserモデルを作成しました。しかし、開発を進めていき、Django Rest Frameworkで上記の機能を実装しようとした際に、ユーザーとはDjangoが提供しているスーパーユーザーであり、私が作成したUserモデルでは上記の登録、ログイン機能を実装できそうにないことが分かりました。
質問
Django Rest Frameworkで自らが作成したUserモデルで、ユーザー登録・認証機能を実装することは可能なのでしょうか?(Reactと繋げる前提でのお話です)
調べたところ、スーパーユーザー自体を編集する機能があったので、スーパーユーザーを編集してみました。しかし、新たにcreateしてもDjangoのスーパーユーザーに紐づけられてはいませんでした。プロジェクト途中からユーザーを変更するのは、非常に困難だと公式ドキュメントに書いていたこともあり、一からやり直すことも検討していますが、そもそも,Djangoが用意したユーザーを使わないと実装できないのか、自ら定義したModelでも実装できるのかが不明確で、詰まってしまいました。
プログラミングを初めて数ヶ月の初心者で、認証機能等の知識が浅いという面は承知の上ですが、ご助言いただければ幸いです。
ご回答よろしくお願いいたします。
コード(Modelsとカスタムスーパーユーザー)
参考として、Userモデルのコードと、私がカスタムしたスーパーユーザーのコードを添付いたします。
Userモデル
class User(models.Model): username = models.CharField(max_length=150, unique=True) email = models.EmailField(max_length=100, unique=True) password = models.CharField(max_length=20) profile = models.TextField(max_length=800, blank=True, null=True) icon = models.ImageField(blank=True, null=True) background = models.ImageField(blank=True, null=True) login = models.BooleanField(default=False) # createdAt, updatedAt は時系列順等に並べたいモデルに付与 created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.username class Meta: db_table = "users"
カスタムスーパーユーザー
class UserManager(BaseUserManager): def create_user(self, username, password=None, **extra_fields): if not username: raise ValueError("ユーザーネームは必ず必要です。") user = self.model(username=username, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, password): return self.create_user(username, password) class User(AbstractBaseUser): username = models.CharField(max_length=150, unique=True) email = models.EmailField(max_length=100, unique=True) profile = models.TextField(max_length=800, blank=True, null=True) icon = models.ImageField(blank=True, null=True) background = models.ImageField(blank=True, null=True) login = models.BooleanField(default=False) # createdAt, updatedAt は時系列順等に並べたいモデルに付与 created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) USERNAME_FIELD = "username" def __str__(self): return self.username class Meta: db_table = "users"
あなたの回答
tips
プレビュー