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

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

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

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

0回答

452閲覧

`Django Restframework`のユーザー認証において、models内で定義したユーザーを認証に使う方法

Toshiyuki023

総合スコア3

Django

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

0グッド

0クリップ

投稿2020/09/06 01:34

実現したいこと

1.django-rest-authを用いて、ユーザー認証を行う。
2.djangoから提供されているユーザーではなく(管理画面等で認証に使われるスーパーユーザーのことです)、models.pyでオブジェクトとして作った(((models.Models))を用いて作ったという意味です)を用いて、ユーザー認証を行う。

####環境
django : 3.1
djangorestframework:3.11.1
python : 3.7.6

背景

現在、ユーザー間で物々交換をできるアプリを作成しようとしています。そして、バックエンドでDjango, フロントエンドでReactを使って開発を進めています。
ユーザー登録機能、ユーザーログイン機能を実装したいと思い、DjangoUserモデルを作成しました。しかし、開発を進めていき、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"

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問