What if we wanted to add more fields to the form like weekly_digest and so on? Well, of course you would have to add a new field to the form and maybe handle extra work in your views. Let’s make this more dynamic.
Let’s create Event model which will store all events. Entries from this model will be generated into fields in the form later:
12345678910111213141516171819202122
fromdjango.dbimportmodelsclassEvent(models.Model):title=models.CharField(max_length=100,help_text='e.g: Weekly News')title_id=models.CharField(max_length=100,blank=True,editable=False)def__unicode__(self):returnself.titledefsave(self,*args,**kwargs):ifnotself.title_id:# Generate title_id based on title# Weekly News > weekly_newsself.title_id=self.title.lower().replace(' ','_').replace("'",'')
And now the form that will generate fields based on all entries in Event model
12345678910
fromdjangoimportformsfrommodelsimportEventclassEmailPreferenceForm(forms.Form):# Auto generate fields based on title_id in Eventdef__init__(self,*args,**kwargs):super(EmailPreferenceForm,self).__init__(*args,**kwargs)fields=Event.objects.all()forfinfields:self.fields[f.title_id]=forms.BooleanField(required=False)
Let’s say you have a Subscriber model that has many Events. This piece of code will initialize the checkboxes based on subscribers’ preferences.
1234567891011121314
fromformsimportEmailPreferenceFormdefemail_preferences(request):ifrequest.method=='POST':email_preferences=EmailPreferenceForm(request.POST)# Process the formelse:# Initialize the preferences. This will make the boxes checked.initial={}foreinsubscriber.events.all():initial[e.title_id]=Trueemail_preferences=EmailPreferenceForm(initial=initial)# Context and HTTPResponses here