Django: переопределение __init__ для пользовательских форм - PullRequest
21 голосов
/ 16 мая 2009

Я делаю пользовательский объект формы в 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.

Ответы [ 2 ]

39 голосов
/ 16 мая 2009

Вы можете динамически изменять свою форму, используя диктовку self.fields. Нечто подобное может работать для вас:

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)
3 голосов
/ 16 мая 2009

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...