cod*_*joe 9 django django-forms django-authentication django-users
我正在试图找出如何从中排除用户名和/或密码的方法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)
Run Code Online (Sandbox Code Playgroud)
Aks*_*aaj 11
如果使用,您将无法执行此操作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.所以,这些字段为您显示.
有关此检查__new__的更多信息,请ModelFormMetaclass访问https://github.com/django/django/blob/master/django/forms/models.py
解决方法:
不要使用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
Run Code Online (Sandbox Code Playgroud)
对于Django v2,只需将密码设置为None。
class UserForm(UserChangeForm):
password = None
class Meta:
model = User
fields = (
'first_name',
'last_name',
'email',
)
Run Code Online (Sandbox Code Playgroud)