Как я могу исключить объявленное поле в ModelForm в подклассе формы? - PullRequest
2 голосов
/ 20 июля 2010

В Django я пытаюсь получить (подкласс) новую форму из ModelForm формы, где я хотел бы удалить некоторые поля (или иметь только некоторые поля, чтобы быть более корректным). Конечно очевидным способом было бы сделать (базовая форма от django.contrib.auth.forms):

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

Но это не работает, так как добавляет / сохраняет также поле username в результирующей форме. Это поле было объявлено явно в UserChangeForm. Даже добавление атрибута username к exclude не помогает.

Есть ли какой-то правильный способ исключить это, и я что-то упускаю? Это ошибка? Есть ли обходной путь?

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Попробуйте это:

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 голос
/ 20 июля 2010

Кажется, что (общий) обходной путь (все еще отсутствует при учете 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]

Но для меня это пахнет ошибкой.

...