2

から継承してカスタム ユーザー モデルを作成django.contrib.auth.models.Userし、管理者に追加しました。管理者からインスタンスを作成すると、MyUser(関連する) 2 つの問題があります。

1-管理者では、プレーンパスワード(暗号化されていない)がpasswordフィールドに表示されます

2- のインスタンスで管理者にログインしようとするとMyUser

Unknown password hashing algorithm '<mypassword>'. Did you specify it in the PASSWORD_HASHERS setting    

バグですか?どうすれば修正できますか?(私はDjango 1.4.2を使用しています)

models.py

from django.contrib.auth.models import User

class MyUser(User):
    number = models.IntegerField()

admin.py

class MyUserAdmin(admin.ModelAdmin):
    pass

admin.site.register(MyUser, MyUserAdmin)

編集

次のようにパスワードが適切に設定されていますが、管理者からいくつかのインスタンスを変更したい場合MyUser、パスワードがクリアされ、再度設定する必要があります:

class MyUserAdminForm(forms.ModelForm):

    class Meta:
        model = MyUser

    def __init__(self, *args, **kwargs):
        super(MyUserAdminForm, self).__init__(*args, **kwargs)
        self.fields['password'].widget = forms.PasswordInput()

    def save(self, commit=True):
        user = super(MyUserAdminForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user


class MyUserAdmin(admin.ModelAdmin):
    form = MyUserAdminForm


admin.site.register(MyUser, MyUserAdmin)
4

2 に答える 2

5

これは、フォームにパスワードを正しく設定していないために発生しています。

Django 認証ユーザーのパスワードは、https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.set_passwordset_password()メソッドを使用して設定する必要があります

通常、ユーザー管理フォームの保存メソッドがこれを処理しますが、独自のフォームを作成したため、これを自分で行う必要があります。これは、管理フォームで必要な save メソッドの例です。

def save(self, commit=True):
    user = super(UserCreationForm, self).save(commit=False)
    user.set_password(self.cleaned_data["password"])
    if commit:
        user.save()
    return user

編集: これがこのエラーが発生する理由ですが、ユーザー プロファイルとここにある手順を使用する必要があることにスティーブに同意します: https://docs.djangoproject.com/en/1.4/topics/auth/#storing-ユーザーに関する追加情報

または、django 1.5 がリリースされるまで待つことができる場合は、構成可能なユーザー モデルがあります: https://docs.djangoproject.com/en/dev/releases/1.5-beta-1/#configurable-user-model

編集2:正しいパスワードで保存する必要があるのはまさに次のとおりです。

フォーム.py

class MyUserAdminForm(forms.ModelForm):
    password1 = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = MyUser

    def save(self, commit=True):
        user = super(MyUserAdminForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user

admin.py

class MyUserAdmin(admin.ModelAdmin):
    form = MyUserAdminForm

admin.site.register(MyUser, MyUserAdmin)
于 2012-12-11T17:10:24.947 に答える
0

User クラスを拡張するには、少し異なるアプローチを取ることをお勧めします。

Django はUser Profiles、ユーザーに関する追加情報を保存する簡単な方法として を使用します。

新しいクラスで 1 対 1 のフィールドを作成して、情報を 1 人のユーザーだけにリンクできるようにすることができます。

class MyUser(User):
    user = models.OneToOneField(User)

    #additional fields
    number = models.IntegerField()

ドキュメントはここにあります- これを管理セクションでも使用できるようにします

于 2012-12-11T17:03:57.223 に答える