如何在ModelForm的子类中排除声明的字段?
在Django中,我想从ModelForm
创建一个新的表单,也就是想要继承它,但我想去掉一些字段(或者说只保留某些字段,更准确一点)。当然,最简单的方法是这样做(基础表单来自django.contrib.auth.forms
):
class MyUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
fields = ('first_name', 'last_name', 'email')
但是这样做不行,因为生成的表单中还是会出现username
字段。这个字段在UserChangeForm
中是明确声明的。即使我把username
加到exclude
属性中,也没有用。
有没有什么合适的方法可以把它排除掉?我是不是漏掉了什么?这是个bug吗?有没有什么解决办法?
2 个回答
1
看起来这个(通用的)解决办法(还没有考虑到exclude
)是:
def __init__(self, *args, **kwargs):
super(UserChangeForm, self).__init__(*args, **kwargs)
for field in list(self.fields):
if field not in self._meta.fields:
del self.fields[field]
不过我觉得这像是个bug。
3
试试这个:
class MyUserChangeForm(UserChangeForm):
def __init__(self, *args, **kwargs):
super(MyUserChangeForm, self).__init__(*args, **kwargs)
self.fields.pop('username')
class Meta(UserChangeForm.Meta):
fields = ('first_name', 'last_name', 'email')
这个代码会在表单创建的时候,动态地移除一个字段。