AbstractUser を拡張するカスタム ユーザー モデルがあります。2 つのカスタム フィールドを追加しました。しかし、デフォルトのメールフィールドを一意で必須にしたい。ネットでいろいろ調べましたが、いいアドバイスが見つかりませんでした。
オーバーライドされた 'clean_email' メソッドを使用して拡張された usercreationform でそれを行うのは正しい方法ですか?
ありがとう
AbstractUser を拡張するカスタム ユーザー モデルがあります。2 つのカスタム フィールドを追加しました。しかし、デフォルトのメールフィールドを一意で必須にしたい。ネットでいろいろ調べましたが、いいアドバイスが見つかりませんでした。
オーバーライドされた 'clean_email' メソッドを使用して拡張された usercreationform でそれを行うのは正しい方法ですか?
ありがとう
email
はすでに にありAbstractUser.REQUIRED_FIELDS
ます。
一意にするには:
class User(AbstractUser):
...
(emailField,) = (f for f in User._meta.fields if f.name == "email")
emailField.unique = True
ちょっとハッキーですが、うまくいくはずです
または、カスタム調整を使用して、単純に拡張しAbstractBaseUser
、不足しているものをAbstractUser
自分自身から追加することもできます
おそらく__init__
、モデルの をオーバーライドして、フィールドを必須かつ一意にすることができます。
アップデート
少し遊んだ後、これは言うよりも簡単であることがわかりました(required = False
親であるときに必要な子クラスでフィールドを作成する方法が見つかりませんでした)。
mderkの答えは私にはうまくいきませんでしたAttributeError: can't set attribute
. その理由は、内部的に Django がunique
の値を に保存するためself._unique
です。
つまり、長い話を短くするために:
class User(AbstractUser):
...
(emailField,) = (f for f in User._meta.fields if f.name == "email")
emailField._unique = True
動作します。
またはさらに良い:
User._meta.get_field('email')._unique = True
ここで与えられたややハックだが効果的な解決策は、Django 1.7 では機能しません。
User._meta.get_field('email')._unique = True
これは、モジュール スコープでモデルにアクセスすると、読み込みが完了するまでモデルを変更してはならないという AppRegistry アサーションに違反するためです。
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
新しいApp Loading機能を使用して、これを行うことができます。アプリ ディレクトリでready
モンキー パッチを実行するメソッドを使用して、AppConfig クラスを定義します。apps.py
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name="your_app_name"
def ready(self):
from .models import MyAbstractUser
MyAbstractUser._meta.get_field_by_name('email')[0]._unique=True
MyAbstractUser
これは、が のサブクラスであると仮定しAbstractUser
ます。
__init__.py
アプリのディレクトリも変更する必要があります。
default_app_config = 'your_app_name.apps.YourAppConfig'
忘れると、新しいready
メソッドは呼び出されません。
これで、システム チェックに合格するはずです。