実現したいこと
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
プレビュー