def save(self, request, contact_type=None):
        if self.instance:
            contact = self.instance
        else:
            contact = Contact()
            contact.contact_type = contact_type

        contact.name = unicode(self.cleaned_data['name'])

        if 'parent' in self.cleaned_data:
            contact.parent = self.cleaned_data['parent']

        if 'related_user' in self.cleaned_data:
            contact.related_user = self.cleaned_data['related_user']

        contact.save()

        if self.instance:
            contact.contactvalue_set.all().delete()
        for field in contact.contact_type.fields.all():
            for form_name in self.cleaned_data:
                if re.match(str("^" + field.name + "___\d+$"), form_name):
                    if isinstance(self.fields[form_name], forms.FileField):
                        value = ContactValue(field=field, contact=contact,
                                             value=self._handle_uploaded_file(form_name))
                        if isinstance(self.fields[form_name], forms.ImageField):
                            self._image_resize(value.value)
                    else:
                        if field.field_type == 'picture' and isinstance(self.fields[form_name],
                                                                        forms.ChoiceField):
                            if self.cleaned_data[form_name] != 'delete':
                                value = ContactValue(field=field, contact=contact,
                                                     value=self.cleaned_data[form_name])
                        else:
                            value = ContactValue(field=field, contact=contact,
                                                 value=self.cleaned_data[form_name])
                    value.save()
        return contact
Process form and create DB objects as required
dataset/ETHPy150Open treeio/treeio/treeio/identities/forms.py/ContactForm.save