2009-05-15 6 views
18

私は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の方法は何でしょうか。

答えて

33

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

私は解決策hereを見つけました。より良い解決策がある場合は、返信を投稿してください。

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) 
関連する問題