如何在ModelForm的子类中排除声明的字段?

2 投票
2 回答
2215 浏览
提问于 2025-04-16 01:33

在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')

这个代码会在表单创建的时候,动态地移除一个字段。

撰写回答