9

Django 1.5 と Python 3.2.3 を使用しています。

ユーザー名の代わりに電子メール アドレスを使用するカスタム認証セットアップがあります。モデルで定義されたユーザー名はまったくありません。それはうまくいきます。それでも、ユーザー作成フォームを作成すると、とにかくユーザー名フィールドに追加されます。だから私は表示したいフィールドを正確に定義しようとしましたが、とにかくユーザー名フィールドをフォームに強制しています....カスタム認証モデルにも存在しません。どうすればそれをやめさせることができますか?

このための私のフォームは次のように定義されています。

class UserCreateForm(UserCreationForm):

    class Meta:
        model = MyUsr
        fields = ('email','fname','surname','password1','password2',
                  'activation_code','is_active')

ドキュメントでは、カスタム ユーザーとビルトイン フォームには、「カスタム ユーザー モデル用に書き直す必要がある」と記載されています。それが私がここでやっていることだと思います。ただし、これもUserCreationFormのドキュメントも、これについてこれ以上何も述べていません。だから、何が欠けているのかわからない。Google経由でも何も見つかりませんでした。

4

2 に答える 2

15

Your UserCreationForm should look something like

# forms.py
from .models import CustomUser

class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label="Password", widget=forms.PasswordInput)
    password2 = forms.CharField(label="Password confirmation", widget=forms.PasswordInput)

    class Meta:
        model = CustomUserModel
        # Note - include all *required* CustomUser fields here,
        # but don't need to include password1 and password2 as they are
        # already included since they are defined above.
        fields = ("email",)

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            msg = "Passwords don't match"
            raise forms.ValidationError("Password mismatch")
        return password2

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

You'll also want a user change form, which won't overrwrite the password field:

class UserChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = CustomUser

    def clean_password(self):
        # always return the initial value
        return self.initial['password']

Define these in your admin like this:

#admin.py

from .forms import UserChangeForm, UserAddForm

class CustomUserAdmin(UserAdmin):
    add_form = UserCreationForm
    form = UserChangeForm

You'll also need to override list_display, list_filter, search_fields, ordering, filter_horizontal, fieldsets, and add_fieldsets (everything in django.contrib.auth.admin.UserAdmin that mentions username, I think I listed all of it).

于 2013-05-15T16:47:43.180 に答える
4

フォームを sctratch から作成する必要があります。UserCreationForm を拡張しないでください。UserCreationForm には、明示的に定義されたユーザー名フィールドと他のフィールドがあります。ここで見ることができます。

于 2013-05-15T11:01:44.863 に答える