Django Dynamic Forms
Django's forms are powerful and simple to use. In most cases, you'll be declaring your fields explicitly. But sometimes you need dynamic forms, and overriding some class methods will let you do just that. This post will show you what to do.
Let's say you want to dynamically add a field to a model form if the user hasn't provided a first name.
First, we declare our model form:
1 2 3 4 5 6
from django import forms from models import Widget class WidgetModelForm(forms.ModelForm): class Meta: model = Widget
Now we override the constructor, adding our field:
1 2 3 4 5 6 7 8
class WidgetModelForm(forms.ModelForm): def __init__(self, request, *args, **kwargs): super(WidgetModelForm, self).__init__(*args, **kwargs) if not request.user.first_name: self.fields['first_name'] = forms.CharField() class Meta: model = Widget
And that's it. Somewhere in our app views, we'd use this form like so:
1 2 3
def my_view(self, request): form = WidgetModelForm(request, request.POST or None) # .. and so on
A few notes:
- Notice that we do have to pass the request object to the form constructor.
- Since we now have this extra argument, we need to leave it out when calling the parent class' constructor.
Looking to use dynamic forms in the admin? Be sure to read the follow up post.