2009-05-15 5 views
18

__init__ 메소드가 오버 라이드 된 Django에서 커스텀 폼 객체를 만들고 있습니다. 이 메서드를 재정의하는 목적은 새 매개 변수를 기반으로 드롭 다운 상자를 동적으로 생성하는 것입니다. 예를 들어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) 
관련 문제