2009-05-15 24 views
18

Estoy creando un objeto de formulario personalizado en Django que tiene un método __init__ anulado. El objetivo de anular el método es generar dinámicamente cuadros desplegables basados ​​en los nuevos parámetros.Django: redefiniendo __init__ para formularios personalizados

Por ejemplo,

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) 

Esta solución no funciona. Parece que los campos se crean antes de llamar a __init__. Yo asumiría que este problema sería bastante común. ¿Cuál sería la manera Django de manejar estas clases de problemas?

Respuesta

33

Puede modificar dinámicamente su formulario utilizando el self.fields dict. Algo como esto puede funcionar para usted:

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

he encontrado una solución here. Si hay una solución mejor, publique una respuesta.

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) 
Cuestiones relacionadas