Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Overriding __init__ for Custom Forms

Tags:

python

django

I am making a custom form object in Django which has an overrided __init__ method. The purpose of overriding the method is to dynamically generate drop-down boxes based on the new parameters.

For example,

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)

This solution does not work. It appears that the fields are created before the __init__ is called. I would assume this problem would be pretty common. What would be the Django way of handling these classes of problems.

like image 513
Eldila Avatar asked May 15 '09 22:05

Eldila


2 Answers

You can dynamically modify your form by using the self.fields dict. Something like this may work for you:

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) 
like image 178
Ayman Hourieh Avatar answered Sep 27 '22 18:09

Ayman Hourieh


I found a solution here. If there is a better solution, please post a reply.

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)
like image 23
Eldila Avatar answered Sep 27 '22 17:09

Eldila