Подтвердить что ты не робот

Django: переопределение __init__ для пользовательских форм

Я делаю пользовательский объект формы в Django, который имеет переопределенный метод __init__. Целью переопределения метода является динамическое создание раскрывающихся ящиков на основе новых параметров.

Например,

class TicketForm(forms.Form):
    Type = Type.GetTicketTypeField()

    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
                  initial=None, label_suffix=':', empty_permitted=False, 
                  ticket=None):

        if ticket:
           self.__class__.State = State.GetTicketStateField(ticket.Type)
           super(forms.BaseForm, self ).__init__(data=data, files=files, 
                  auto_id=auto_id, prefix=prefix, initial=initial, 
                  label_suffix=label_suffix, empty_permitted=empty_permitted)

Это решение не работает. Похоже, что поля создаются до вызова __init__. Я бы предположил, что эта проблема будет довольно распространенной. Каким будет метод Django для обработки этих классов проблем.

4b9b3361

Ответ 1

Вы можете динамически изменять свою форму с помощью self.fields dict. Для вас может быть что-то вроде этого:

class TicketForm(forms.Form):

  Type = Type.GetTicketTypeField()

  def __init__(self, ticket, *args, **kwargs):
    super(TicketForm, self).__init__(*args, **kwargs)
    self.fields['state'] = State.GetTicketStateField(ticket.Type)

Ответ 2

Я нашел решение здесь. Если есть лучшее решение, отправьте ответ.

class TicketForm(forms.Form):
    Type = Type.GetTicketTypeField()

    def __init__(self, ticket=None, *args, **kwargs):   
        super(TicketForm, self ).__init__(*args, **kwargs)
        if ticket:
            self.fields['State'] = State.GetTicketStateField(ticket.Type)