... or how to get a dynamic drop-down list with Django forms
The problem: Lets say that you need a form with a drop-down list that have dynamic values. With Django this can be done simple and fast, but if you are new you may get yourself into a trap. In a standard form(with static values in the drop-down) your code will be something like this:
MY_CHOICES = ( ('1', 'Option 1'), ('2', 'Option 2'), ('3', 'Option 3'), ) class MyForm(forms.Form): my_choice_field = forms.ChoiceField(choices=MY_CHOICES)
def get_my_choices(): # you place some logic here return choices_list class MyForm(forms.Form): my_choice_field = forms.ChoiceField(choices=get_my_choices())
def get_my_choices(): # you place some logic here return choices_list class MyForm(forms.Form): def __init__(self, *args, **kwargs): super(MyForm, self).__init__(*args, **kwargs) self.fields['my_choice_field'] = forms.ChoiceField( choices=get_my_choices() )
You first call the __init__ method of the parent class(Form) using the super keyword and then declare your dynamic fields(in this case my_choice_field). With this code get_my_choices is called on every form load and you will get your dynamic drop-down.
Final words: have in mind that this method also have one strong drawback. If your application have a heavy load, executing a logic on every form load may(will) bring you troubles. So some caching of the form or the logic result may be useful.
And remember If you have other approach, idea or question I am always ready to hear it.