注: この記事は当初、私のサブスタック (https://andresalvareziglesias.substack.com/
) に投稿されました。
これは、この Django AllAuth 一連の投稿の最後の章です。これら 5 つの章で、すべての認証ニーズを処理するための非常に役立つ Django コンポーネントという、ちょっとした不思議な要素を発見しました。この章では、基本的な Django ユーザー モデルを拡張してカスタム フィールドを追加する方法を学びます。
AllAuth は、標準の Django ユーザー モデルに加えて、ソーシャル ログインとログイン トークンを処理するための追加のテーブルを使用します。 Django 5 では、ユーザー モデルは django.contrib.auth パッケージにあり、公式ドキュメントにあるように、事前定義されたフィールドが多数あります。
これだけではプロジェクトには不十分な場合があります。 Django を使用すると、カスタムのユーザー テーブルとユーザー マネージャーを作成して、あらゆるプロジェクトのニーズに対応できます。
ログインおよび登録プロセスを処理するために、カスタム User テーブルとカスタム UserManager を作成します。
サンプル プロジェクトで models.py を開き、次のようなコードを記述します:
class MyCustomUser(AbstractBaseUser): email = models.EmailField(unique=True) first_name = models.CharField(max_length=30, blank=True) last_name = models.CharField(max_length=30, blank=True) is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) timezone = models.CharField(max_length=30, default='UTC') is_custom = models.BooleanField(default=False) is_staff = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects = MyCustomUserManager() USERNAME_FIELD = 'email' EMAIL_FIELD = 'email' def __str__(self): return self.email def has_perm(self, perm, obj=None): return True def has_module_perms(self, app_label): return True @property def is_utc(self): return self.timezone == 'UTC'
Django の AbstractBaseUser モデルを拡張して新しい User モデルを定義できます。この新しいモデルでは、必要なすべてのフィールドまたはカスタム プロパティを追加できます。
これらの行は重要です:
objects = MyCustomUserManager() USERNAME_FIELD = 'email' EMAIL_FIELD = 'email'
これらの行で、ユーザー モデルをカスタム UserManager にリンクし、一意の「ユーザー名」として機能するフィールドも定義しています。
Django 管理ツールから管理するには、必ず新しいモデルを admin.py に登録してください。
from django.contrib import admin from .models import MyCustomUser admin.site.register(MyCustomUser)
サンプル プロジェクトで models.py を再度開き (または、必要に応じてカスタム UserManager 用に別のファイルを生成し)、次のようなコードを記述します。
class MyCustomUserManager(BaseUserManager): def create_user(self, email, password=None): if not email: raise ValueError('Users must have an email address') user = self.model( email=self.normalize_email(email), ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, password): user = self.create_user( email=email, password=password, ) user.is_admin = True user.is_staff = True user.save(using=self._db) return user
この例では、BaseUserManager を拡張してカスタム UserManager を作成しています。新しいユーザーが作成され、期待どおりにカスタム フィールドが入力されます。
カスタム User モデルの UserManager の前に定義したため、Django は新しいユーザーの作成時にどのクラスを使用するかを認識します。
プロジェクトの設定ファイルでは、次のようにしてプロジェクトの現在のユーザー モデルを設定できます。
# Set custom user model as the active one AUTH_USER_MODEL = 'demo.MyCustomUser' # Configure AllAuth username related management, because we are # using the e-mail as username. See: # https://docs.allauth.org/en/latest/account/advanced.html ACCOUNT_AUTHENTICATION_METHOD = 'email' ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_UNIQUE_EMAIL = True ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_USER_MODEL_USERNAME_FIELD = None
この小さな変更 (および通常どおり必要な DB 移行) だけで、AllAuth サインアップ ビューを使用してユーザーの作成を開始し、光沢のあるカスタム UserManager とそのモデルの動作を確認できます。素早く簡単です。
この例では電子メールをユーザー名として使用しているため、AllAuth ユーザー名関連の管理も無効にします。
この AllAuth シリーズの最終章に到達しました。 AllAuth は、アプリで認証を処理するための素晴らしいライブラリであり、事前定義された統合の膨大なリストのおかげで、ソーシャル ログインの操作が特に簡単になります。
これはシリーズの最終章ですが、今後の投稿で AllAuth について再度取り上げます。読んでいただきありがとうございます。コーディングを楽しんでください!
Python と Docker の投稿のうち、次のような他の関連トピック (常にテクノロジーとプログラミングのトピックであることを約束します...厳禁) についても書きます。
何か興味深いテクノロジー、プログラミング言語などを見つけたら、ぜひ知らせてください。私はいつでも新しいことを学ぶことにオープンです!
私はアンドレスです。パルマに拠点を置くフルスタック ソフトウェア開発者で、コーディング スキルを向上させるために個人的な旅を続けています。私は自費出版のファンタジー作家でもあり、自分の名前で 4 冊の小説を出版しています。何でもお気軽に聞いてください!
以上がDjango AllAuth 章 カスタム フィールドを使用した Django AllAuth ユーザー モデルの拡張の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。