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 для обработки этих классов проблем.
Ответы
Ответ 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)