【问题标题】:Exclude username or password from UserChangeForm in Django Auth从 Django Auth 中的 UserChangeForm 中排除用户名或密码
【发布时间】:2013-04-26 14:01:28
【问题描述】:

我正在尝试找出如何从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)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 它工作正常。但为什么我明确需要告诉 password = None ?因为我没有在字段中包含密码。
    • 那是因为UserChangeForm确实包含密码字段,所以你需要覆盖它。
    • 拯救了我的一天。非常有用的提示。
    【解决方案2】:

    如果您使用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__ of 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 
    

    【讨论】:

    • 好的,但是现在每次我调用save() 时,用户名和密码都会被清空。加上我的扩展用户类的参数没有得到保存。
    【解决方案3】:

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

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

    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/

    【讨论】:

      猜你喜欢
      • 2018-11-19
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2011-10-18
      • 2021-09-09
      相关资源
      最近更新 更多