11

からユーザー名やパスワードを除外する方法を見つけようとしていますUserChangeFormexclude私は両方を試しましfieldsたが、これら 2 つの分野ではうまくいきません。

ここにいくつかのコードがあります:

class ArtistForm(ModelForm):
    class Meta:
        model = Artist
        exclude = ('user',)

class UserForm(UserChangeForm):
    class Meta:
        model = User
        fields = (
            'first_name',
            'last_name',
            'email',
            )
        exclude = ('username','password',)

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper
        self.helper.form_tag = False
        super(UserForm, self).__init__(*args, **kwargs)
        artist_kwargs = kwargs.copy()
        if kwargs.has_key('instance'):
            self.artist = kwargs['instance'].artist
            artist_kwargs['instance'] = self.artist
        self.artist_form = ArtistForm(*args, **artist_kwargs)
        self.fields.update(self.artist_form.fields)
        self.initial.update(self.artist_form.initial)

    def clean(self):
        cleaned_data = super(UserForm, self).clean()
        self.errors.update(self.artist_form.errors)
        return cleaned_data

    def save(self, commit=True):
        self.artist_form.save(commit)
        return super(UserForm, self).save(commit)
4

3 に答える 3

11

を使用すると、これを行うことができなくなりますUserChangeForm

このhttps://github.com/django/django/blob/master/django/contrib/auth/forms.pyを参照してください。

UserChangeFormこのページでは、 と が明示的に定義されてusernameいることに気付くでしょうpassword。これらのフィールドはdeclared_fields、フォームの変数に存在します。

excludeで定義されfieldsたフィールドでのみ動作します。一部のフィールドを明示的に定義すると、 を使用して除外されていてもフォームに表示されます。したがって、これらのフィールドが表示されます。modelMetadeclared_fieldsexclude

このチェック__new__の詳細についてはModelFormMetaclasshttps://github.com/django/django/blob/master/django/forms/models.pyを参照してください。

回避策:

UserChangeForm を使用せず、そのコードを読んでください。それはあなたに多くを提供しません。ユーザーからのみ拡張され、ユーザーとしてModelForm設定される独自のフォームを作成できMeta Modelます。フォームのパーツをコピーUserChangeFormします。

class UserForm(forms.ModelForm):

    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        #copy any functionality you want form UserChangeForm

    def clean_password(self):
        #copy functionality provided by UserChangeForm 
于 2013-05-02T13:19:56.027 に答える