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

时间:2010-07-20 07:53:31

标签: python django django-forms modelform

在Django中,我试图从ModelForm形式派生(子类)一个新表单,我想删除一些字段(或者只有一些字段,更正确)。当然可以采用明显的方法(基本形式来自django.contrib.auth.forms):

class MyUserChangeForm(UserChangeForm):
  class Meta(UserChangeForm.Meta):
    fields = ('first_name', 'last_name', 'email')

但这不起作用,因为它在结果表单中添加/保留username字段。此字段已在UserChangeForm中明确声明。即使将username添加到exclude属性也无济于事。

是否有一些正确的方法可以排除它而我错过了什么?这是一个错误吗?有一些解决方法吗?

2 个答案:

答案 0 :(得分: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')

这会在创建表单时动态删除表单。

答案 1 :(得分: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]

但这对我来说闻起来像个臭虫。