我正在尝试找出如何从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)
答案 0 :(得分:10)
如果您使用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__
ModelFormMetaclass
的{{1}}支票。{/ 1>
解决方法:
不要使用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
答案 1 :(得分:2)
对于Django v2,只需将密码设置为“无”即可。
class UserForm(UserChangeForm):
password = None
class Meta:
model = User
fields = (
'first_name',
'last_name',
'email',
)
答案 2 :(得分:0)
我认为它可以帮助你...
在模板中迭代表单字段时,写
if for field in UserChangeFormObject:
{% ifnotequal field.lable password %}
#process your form field here
{% endifnotequal%}