Динамично обновите Метакласс ModelForm

23
задан Daniel Naab 9 December 2009 в 02:13
поделиться

2 ответа

Метакласс используется для динамичного построения определения формы - поэтому к тому времени, когда Вы создали экземпляр 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'))
56
ответ дан Daniel Naab 29 November 2019 в 00:51
поделиться

Иначе:

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'])
13
ответ дан 29 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: