2009-05-15 14 views
18

Tworzę niestandardowy obiekt formularza w Django, który ma nadpisaną metodę __init__. Celem nadpisania metody jest dynamiczne generowanie rozwijanych skrzynek w oparciu o nowe parametry.Django: Zastępowanie __init__ dla formularzy niestandardowych

Na przykład

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) 

To rozwiązanie nie działa. Wygląda na to, że pola są tworzone przed wywołaniem __init__. Zakładam, że ten problem będzie dość powszechny. Jaki byłby sposób postępowania Django z tymi klasami problemów.

Odpowiedz

33

Można dynamicznie modyfikować formularz za pomocą dyktatury self.fields. Coś takiego może ci pomóc:

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

Znalazłem rozwiązanie here. Jeśli istnieje lepsze rozwiązanie, opublikuj odpowiedź.

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) 
Powiązane problemy