2009-05-15 13 views
18

के लिए __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) 
संबंधित मुद्दे