6

AbstractUser を拡張するカスタム ユーザー モデルがあります。2 つのカスタム フィールドを追加しました。しかし、デフォルトのメールフィールドを一意で必須にしたい。ネットでいろいろ調べましたが、いいアドバイスが見つかりませんでした。

オーバーライドされた 'clean_email' メソッドを使用して拡張された usercreationform でそれを行うのは正しい方法ですか?

ありがとう

4

6 に答える 6

3

emailはすでに にありAbstractUser.REQUIRED_FIELDSます。

一意にするには:

class User(AbstractUser):
    ...

(emailField,) = (f for f in User._meta.fields if f.name == "email")
emailField.unique = True

ちょっとハッキーですが、うまくいくはずです

または、カスタム調整を使用して、単純に拡張しAbstractBaseUser、不足しているものをAbstractUser自分自身から追加することもできます

于 2013-02-16T17:29:51.890 に答える
0

おそらく__init__、モデルの をオーバーライドして、フィールドを必須かつ一意にすることができます。

アップデート

少し遊んだ後、これは言うよりも簡単であることがわかりました(required = False親であるときに必要な子クラスでフィールドを作成する方法が見つかりませんでした)。

于 2013-02-15T23:27:00.220 に答える
0

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
于 2013-05-03T10:38:06.107 に答える
0

ここで与えられたややハックだが効果的な解決策は、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メソッドは呼び出されません。

これで、システム チェックに合格するはずです。

于 2014-12-04T20:43:54.593 に答える