88

Django.Contrib.Auth ドキュメントから:

Django のデフォルト User の拡張 Django の User モデルに完全に満足していて、追加のプロファイル情報を追加したい場合はdjango.contrib.auth.models.AbstractUser、カスタム プロファイル フィールドをサブクラス化して追加するだけです。このクラスは、デフォルトの User の完全な実装を抽象モデルとして提供します。

言ってやった。以下のような新しいモデルを作成しました。

class MyUser(AbstractUser):
  some_extra_data = models.CharField(max_length=100, blank=True)

これは、Django の標準とほとんど同じように admin に表示されますUser。ただし、admin の最も重要な違いは、password-(re)set フィールドが存在せず、代わりに通常の CharField が表示されることです。これを機能させるには、admin-config 内のものをオーバーライドする必要がありますか? もしそうなら、どうすればDRYな方法でそれを行うことができますか(つまり、Djangoソースから何かをコピーせずに...うわー...)?

4

5 に答える 5

143

Django のソース コードをしばらく掘り下げた後、機能するソリューションを見つけました。私はこの解決策に完全に満足しているわけではありませんが、うまくいくようです。より良い解決策を提案してください!


Django は、モデルUserAdminの素敵な管理者の外観をレンダリングするために使用しますUser。これをファイルで使用するだけadmin.pyで、モデルの外観を同じにすることができます。

from django.contrib.auth.admin import UserAdmin
admin.site.register(MyUser, UserAdmin)

ただし、Django Admin は特別なフィールドを表示しないため、これだけではおそらく良い解決策ではありません。これには 2 つの理由があります。

  • UserAdminUserChangeFormオブジェクトを変更するときに使用するフォームとして使用し、オブジェクトUserをモデルとして使用します。
  • UserAdminformsetsは、後で によって使用される -property を定義しUserChangeFormます。これには、特別なフィールドは含まれません。

そのため、変更フォームが正しいモデルを使用するように、Meta 内部クラスをオーバーロードする特別な変更フォームを作成しました。UserAdminまた、特別なフィールドをフィールドセットに追加するためにオーバーロードする必要がありました。改善を提案してください!

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm

class MyUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = MyUser

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm

    fieldsets = UserAdmin.fieldsets + (
            (None, {'fields': ('some_extra_data',)}),
    )


admin.site.register(MyUser, MyUserAdmin)
于 2013-02-21T22:55:33.977 に答える