9

カスタム ユーザー モデルを作成しようとしていますが、これは私が持っているコードです。

models.py

class CustomUser(AbstractUser):
    USERNAME_FIELD = 'email'

CustomUser._meta.get_field_by_name('email')[0]._unique=True

設定.py

AUTH_USER_MODEL = 'myapp.CustomUser'

manage.py syncdb を実行すると、次のエラーが発生します。

CommandError: One or more models did not validate:
myapp.customuser: The field named as the USERNAME_FIELD should not be included in REQUIRED_FIELDS on a swappable User model.

誰でも光を当てることができますか?AbstractBaseUser を拡張するクラス全体を書き直すことなく、Django 1.6 でユーザー モデルをカスタマイズするより良い方法はありますか?

ところで、コードから USERNAME_FIELD = 'email' を削除し、コアの django auth/models.py >> AbstractUser 定義を変更すると、機能します。USERNAME_FIELD をオーバーライドできないようです...

ありがとう!

4

3 に答える 3

12

エラー メッセージから明らかなように、その理由は、 がAbstractUser定義されているためですREQUIRED_FIELDS = ['email']。また、 のフィールドを に設定することはできませREQUIRED_FIELDSUSERNAME_FIELD。詳細はこちら

したがって、プライマリ フィールドとして使用する場合は、 onではなくon でemailフィールドを拡張して再定義することをお勧めします。emailAbstractBaseUserAbstractUser

また、この質問と回答のペアは、あなたの要件を完全に把握していない場合に備えて、あなたに関連している可能性があります.

于 2013-09-17T15:26:35.280 に答える
6

Josvic、あなたのソリューションは私の問題を部分的に解決しました。私が最終的にしなければならなかったのはこれでした:

class CustomUser(AbstractUser):

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def get_username(self):
        return self.email

CustomUser._meta.get_field_by_name('email')[0]._unique=True

これにより、REQUIRED_FIELDS に USERNAME_FIELD を含めることができないという最初の問題が解決されました。ユーザー全体を再定義して AbstractBaseUser を拡張したくないため、REQUIRED_FIELD に「ユーザー名」を含める必要がありました。そうしないと、syncdb が別の理由で失敗します (データベースに保存するためのユーザー名):

self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
TypeError: create_superuser() takes exactly 4 arguments (3 given)

したがって、初めて syncdb を実行してスーパーユーザーを入力する必要がある場合、電子メールは、電子メールとユーザー名として 2 回入力する必要があります。ぎこちないですが、私が一緒に暮らすことができる最もきれいなものです。

乾杯!

于 2013-09-17T15:41:44.733 に答える
2

Josvic は頭に釘を打ちましたが、私が使用したソリューションを提供したいと思います。とてもシンプルです。

  1. 「メール」または使用しているものはすべてUSERNAME_FIELDから削除しREQUIRE_FIELDSます。

  2. 作成した UserManager で、次のように記述します。

    電子メールでない場合: ValueError('ユーザーには電子メール アドレスが必要です') を発生させます

このようにして、電子メールが必須であることを手動で強制します。

このソリューションは、ここで使用されているものです: https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#a-full-example

于 2015-01-18T19:33:22.190 に答える