Django - how to test a clean form method, whether it's insert or update

I have a form where I check in a clean method whether a ProjectMembership object exists that has the same values ​​for the project and member. This is because in the ProjectMembership model I defined a unique_together constraint for the project and member. Actually this works great.

class ProjectMembershipForm(forms.ModelForm): project = forms.ModelChoiceField(Project.objects, widget=HiddenInput()) class Meta: model = ProjectMembership def clean(self): cleaned_data = self.cleaned_data project = cleaned_data.get("project") member = cleaned_data.get("member") print ProjectMembership.objects.filter(project=project, member=member).count() if ProjectMembership.objects.filter(project=project, member=member).count() > 0: del cleaned_data["project"] del cleaned_data["member"] raise forms.ValidationError('The user "%s" is already part of the project team for project "%s".' % (member, project)) return cleaned_data 

But now I ask myself how can I judge by a pure method whether the user is trying to create a new relationship or update the relationship. Because using this clean method, it is not possible to perform an update because it returns an error message that the record already exists.

+7
django-forms
source share
2 answers

You can try changing this:

 if ProjectMembership.objects.filter(project=project, member=member).count() > 0: 

more or less like this:

 if ProjectMembership.objects.filter(project=project, member=member).exclude(pk=self.instance.id).count() > 0: 

in fact you need to check if self.instance is not None before using it in exclude, but hopefully this small snippet gave you an idea of ​​how you can accomplish your task without duplicating forms.

+5
source share

Try the following:

 if self.instance.pk: update_procedure() else: insert_procedure() 
+16
source share

All Articles