Метакласс используется для динамичного построения определения формы - поэтому к тому времени, когда Вы создали экземпляр ModelForm, поля не в исключении были уже добавлены как атрибуты нового объекта.
нормальный способ сделать это состоял бы в том, чтобы просто иметь несколько определений классов для каждого возможного, исключают список. Но если Вы хотите, чтобы сама форма была динамичной, необходимо будет создать определение класса на лету. Что-то как:
def get_form(exclude_list):
class MyForm(ModelForm):
class Meta:
model = Passenger
exclude = exclude_list
return MyForm
form_class = get_form(('field1', 'field2'))
form = form_class()
ОБНОВЛЕНИЕ : Я просто пересмотрел это сообщение и думал, что отправлю немного больше идиоматического способа обработать динамический класс:
def PassengerForm(exclude_list, *args, **kwargs):
class MyPassengerForm(ModelForm):
class Meta:
model = Passenger
exclude = exclude_list
def __init__(self):
super(MyPassengerForm, self).__init__(*args, **kwargs)
return MyPassengerForm()
form = PassengerForm(('field1', 'field2'))
Иначе:
class PassengerInfoForm(ModelForm):
def __init__(self, *args, **kwargs):
exclude_list=kwargs.pop('exclude_list', '')
super(PassengerInfoForm, self).__init__(*args, **kwargs)
for field in exclude_list:
del self.fields[field]
class Meta:
model = Passenger
form = PassengerInfoForm(exclude_list=['field1', 'field2'])