从Django Auth中的UserChangeForm中排除用户名或密码

时间:2013-05-02 11:49:54

标签: django django-forms django-authentication django-users

我正在尝试找出如何从UserChangeForm中排除用户名和/或密码的方法。我尝试了excludefields,但我不适用于这两个字段。

以下是一些代码:

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)

3 个答案:

答案 0 :(得分:10)

如果您使用UserChangeForm,则无法执行此操作。

请参阅此https://github.com/django/django/blob/master/django/contrib/auth/forms.py

您会注意到此页面上的UserChangeForm明确定义了usernamepassword。这些字段存在于表单上的变量declared_fields中。

excludefields仅适用于model中定义的Meta字段。如果您明确定义某个字段,即declared_fields,则即使已使用exclude排除这些字段,它们也会出现在表单上。所以,这些字段为您显示。

要详细了解https://github.com/django/django/blob/master/django/forms/models.py __new__ ModelFormMetaclass的{​​{1}}支票。{/ 1>

解决方法:

不要使用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 

答案 1 :(得分:2)

对于Django v2,只需将密码设置为“无”即可。

class UserForm(UserChangeForm):
    password = None

    class Meta:
        model = User
        fields = (
            'first_name',
            'last_name',
            'email',
            )

答案 2 :(得分:0)

我认为它可以帮助你...

在模板中迭代表单字段时,写

if for field in UserChangeFormObject:
    {% ifnotequal field.lable password %}
        #process your form field here
    {% endifnotequal%}

在此处阅读更多https://docs.djangoproject.com/en/1.6/releases/1.2/