3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DjangoのAbstractBaseUserでのエラー|Unknown field(s) (username) specified

Posted at

カスタムユーザーをAbstractBaseUserを使って作成し、adminで表示しようと際のエラー。

#これ
スクリーンショット 2019-03-07 19.57.17.png

[Admin]→[user]→[user detail]
ユーザー詳細の変更をしようとした際に出現

#エラー内容

FieldError at /admin/appauth/user/XXXXXXXXXXXXXXXXXXXX/change/
Unknown field(s) (username) specified for User. Check fields/fieldsets/exclude attributes of class MyUserAdmin.

Djangoでカスタムユーザーモデルを利用しようした際に「えーいなんのこっちゃ精神」でAbstractBaseUserを使った際にちょっとつまずいた。
したかったことは、Adminページでusernameをfieldsetsで表示すること。
class User(AbstractBaseUser, PermissionsMixin):
ググると、stackoverflowでmodelの型関係かと思ったが違った。

appauth(任意)/models.py

username = models.CharField(
        _('username'),
        max_length=150,
        blank=True,
        null=True,
        unique=True,
        help_text=_(
            'Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("そのユーザーネームはすでに存在しています。"),
        },
    )

blankとか,nullとかをごにょごにょしてみたが、どうも違う。

#Djangoのドキュメントを読みましょう
該当はこの辺り
https://docs.djangoproject.com/ja/2.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project

抜粋:
You should also define a custom manager for your user model. If your user model defines username, email, is_staff, is_active, is_superuser, last_login, and date_joined fields the same as Django's default user, you can just install Django's UserManager; however, if your user model defines different fields, you'll need to define a custom manager that extends BaseUserManager providing two additional methods:

Djangoのdefault userでusernameとか新たに定義したい時はUserManagerを使って、違うfieldとして定義しましょう、的な。

私もよく読めてないので、一度読み返します。

#解決策

とりあえず、別物として定義。

拡張して定義するのが正解だと思うけど認証をメールを使ってそれをusernameとしていることがあるので一時的にこれで対処.
(一度勉強し直す必要アリ)

appauth(任意)/models.py

user_name = models.CharField( #usernameをuser_nameに変更
        _('username'),
        max_length=150,
        blank=True,
        null=True,
        unique=True,
        help_text=_(
            'Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("そのユーザーネームはすでに存在しています。"),
        },
    )

これで、

appauth(任意)/admin.py
.
@admin.register(User)
class MyUserAdmin(UserAdmin):
    fieldsets = (
        (None, {'fields': ( 'user_name')}),

とかで一旦は解決

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?