Dynamic Form Fields Django
Class ProfileForm(forms.ModelForm): first_name = forms.CharField(required=True) last_name = forms.CharField(required=True) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) interests = ProfileInterest.objects.filter( profile=self.instance ) for i in range(len(interests) + 1): field_name = 'interest_%s' % (i,) self.fields[field_name] = forms.CharField(required=False) try: self.initial[field_name] = interests[i].interest except IndexError: self.initial[field_name] = “” # create an extra blank field field_name = 'interest_%s' % (i + 1,) self.fields[field_name] = forms.CharField(required=False) def clean(self): interests = set() i = 0 field_name = 'interest_%s' % (i,) while self.cleaned_data.get(field_name): interest = self.cleaned_data[field_name] if interest in interests: self.add_error(field_name, 'Duplicate') else: interests.add(interest) i += 1 field_name = 'interest_%s' % (i,) self.cleaned_data[“interests”] = interests def save(self): profile = self.instance profile.first_name = self.cleaned_data[“first_name”] profile.last_name = self.cleaned_data[“last_name”] profile.interest_set.all().delete() for interest in self.cleaned_data[“interests”]: ProfileInterest.objects.create( profile=profile, interest=interest, )
Source: www.caktusgroup.com