20

開発ドキュメントで説明されているように、django ユーザー モデルを拡張します。元の User モデルの機能のほとんどを保持したくないので、AbstractUser クラスを拡張します。私はsettings.pyで定義しました:

AUTH_USER_MODEL = 'myapp.CustomUser'

私のユーザークラス:

class CustomUser(AbstractUser):
  custom_field = models.ForeignKey('OtherModel')
  objects = UserManager()

すべて正常に動作しているように見えますが、管理サイトで管理しようとすると:

admin.site.register(CustomUser, UserAdmin)

管理者の CustomUser 作成ページで次のエラーが表示されます (パスワード確認フォームの検証後)。

AttributeError: Manager isn't available; User has been swapped for 'myapp.CustomUser'

ポイントは、元の User モデルと同じ作成プロセス (パスワード検証を伴う 2 段階のプロセス) を行うために、このモデルを管理サイトで管理する必要があるということです。

4

7 に答える 7

20

ユーザーを追加するためのフォームを変更するだけです (clean_username を上書きし、get_user_model() でユーザーを変更します)。

完全な作業例 (AbstractUser から継承した場合)

from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm


class MyUserChangeForm(UserChangeForm):

    class Meta:
        model = get_user_model()

class MyUserCreationForm(UserCreationForm):

    class Meta:
        model = get_user_model()

    def clean_username(self):
        username = self.cleaned_data["username"]
        try:
            get_user_model().objects.get(username=username)
        except get_user_model().DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm
    add_form = MyUserCreationForm
    fieldsets = (
        (None, {'fields': [('username', 'password'),]}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
                                   'groups', 'user_permissions')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
        )

admin.site.register(MyUser, MyUserAdmin)
于 2012-11-30T08:25:56.007 に答える
4

おそらく公式ドキュメントの完全な例を見る必要があります。

https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example

いくつかの明らかにされた質問(たとえば、許可の処理)がありますが、少なくとも、それは機能しています。

于 2013-03-08T10:56:47.903 に答える
0

私は解決策を見つけました:私は UserAdmin を使用して管理サイトに CustomUser を登録せず、カスタム ModelAdmin を使用します。

class CustomUserAdmin(admin.ModelAdmin):

  add_form = CustomUserCreationAdminForm
  add_fieldsets = (
    (None, {
        'classes': ('wide',),
        'fields': ('username', 'password1', 'password2')}
    ),
  )
  def get_fieldsets(self, request, obj=None):
    if not obj:
        return self.add_fieldsets
    return super(CustomUserAdmin, self).get_fieldsets(request, obj)

  def get_form(self, request, obj=None, **kwargs):
    defaults = {}
    if obj is None:
        defaults.update({
            'form': self.add_form,
            'fields': admin.util.flatten_fieldsets(self.add_fieldsets),
        })
    defaults.update(kwargs)
    return super(CustomUserAdmin, self).get_form(request, obj, **defaults)

更新フォームとは異なる作成フォームが必要なため、UserAdmin django コードで行われたように、Model Admin の get_form 関数をオーバーライドします。また、カスタム ユーザー用のカスタム作成フォームを作成しました: CustomUserCreationForm

django-users メーリング リストで、私よりも優れていると思われる応答を受け取りました。管理サイトから元の User クラスを登録解除し、CustomUser を UserAdmin に登録します。

admin.site.unregister(User)
admin.site.register(CustomUser, UserAdmin)

まだテストされていません。

編集:この最後の解決策は機能しません

よろしく

于 2012-11-27T21:23:30.590 に答える
0

Django ドキュメントから:

User モデルのカスタム マネージャーも定義する必要があります。

于 2012-11-26T15:58:28.893 に答える
0

サブクラスはAbstractUser既に処理objects = UserManager()しています (このコードは githubの 327 行目)。モデルで再度定義する必要はありません。

なぜそのエラーが発生するのかわかりません。しかし、以下の設定は最新のDevバージョンでうまくいくようです。

Model.py:

class CustomUser(AbstractUser):
  custom_field = models.ForeignKey('OtherModel')
  # remove : objects = UserManager()
于 2012-11-26T17:02:41.190 に答える