11

我试图找出一种方法来排除用户名和/或密码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)
4

3 回答 3

17

对于 Django v2,只需将密码设置为无。

class UserForm(UserChangeForm):
    password = None

    class Meta:
        model = User
        fields = (
            'first_name',
            'last_name',
            'email',
            )
于 2018-11-16T11:22:08.303 回答
11

如果您使用UserChangeForm.

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

您会注意到UserChangeForm在此页面上明确定义了usernamepassword。这些字段以变量形式出现在declared_fields表单上。

exclude并且fields仅适用于从中model定义的字段Meta。如果您明确定义了一些字段,即declared_fields,它们将出现在表单上,​​即使它们已被排除在外exclude。因此,这些字段为您显示。

https://github.com/django/django/blob/master/django/forms/models.py阅读有关此检查__new__的更多信息ModelFormMetaclass

解决方法:

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

我想它可以帮助你...

在遍历模板中的表单字段时,写

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/

于 2014-03-28T14:05:28.323 回答