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

Posted

技术标签:

【中文标题】从 Django Auth 中的 UserChangeForm 中排除用户名或密码【英文标题】:Exclude username or password from UserChangeForm in Django Auth 【发布时间】: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)

【问题讨论】:

【参考方案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/

【讨论】:

以上是关于从 Django Auth 中的 UserChangeForm 中排除用户名或密码的主要内容,如果未能解决你的问题,请参考以下文章

当他从所有浏览器(Django-rest-auth,JWT)更改密码时如何注销用户?

Django中的auth模块

将 CSS 类添加到 django.contrib.auth.views.login 中的字段

如何使用 django-rest-auth 和 Mailgun 从 Django 发送密码重置电子邮件

如何使用 allauth 和 rest-auth 从 React 前端在 Django 中重新发送确认电子邮件

Heroku中的Django部署:createsuperuser失败:django.db.utils.OperationalError:没有这样的表:auth_user