从 Django Auth 中的 UserChangeForm 中排除用户名或密码
Posted
技术标签:
【中文标题】从 Django Auth 中的 UserChangeForm 中排除用户名或密码【英文标题】:Exclude username or password from UserChangeForm in Django Auth 【发布时间】:2013-04-26 14:01:28 【问题描述】:我正在尝试找出如何从UserChangeForm
中排除用户名和/或密码的方法。 exclude
和 fields
我都试过了,但我不适用于这两个领域。
这里有一些代码:
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
明确定义了username
和password
。这些字段存在于表单上的变量 declared_fields
中。
exclude
和 fields
仅适用于取自 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)更改密码时如何注销用户?
将 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