Erickson Kitoz
Erickson Kitoz

Reputation: 53

Django: How can i validate the combination existance of two fields?

I'm using Django Model Form. Can anyone help me validate those fields to get field error using clean()?

The Name field cannot be repeated in the same office, only in a different one.

form.py

class CreateSalesRepForm(forms.ModelForm):
    class Meta:
        model = CreateSalesRep
        fields = ['name', 'office']

        widgets = {

        'office': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Enter Office'}),
        'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter Name'})

        }

UPDATED (form.py) --- Here is the solution, you can use this codes to validate both insert and update form.

    def clean(self):
        cleaned_data = super().clean()
        office = cleaned_data.get("office")
        name = cleaned_data.get("name")
        duplicates = CreateSalesRep.objects.filter(office=office, name=name)
        if (self.instance.pk and None):
            duplicates = duplicates.filter(pk=self.instance.pk)
        if duplicates.exists():
            msg = "Name already exist in office selected"
            self.add_error('name', msg)
            self.add_error('office', msg)

view.py

def create_salesrep(request):
    if request.method == "POST":
        form = CreateSalesRepForm(request.POST or None)
        if form.is_valid():
            form.save()
            messages.success(request, 'Successfully Saved!', 'alert-success')
            return redirect('sales_rep')
        else:
            return render(request, 'salesrep/create_salesrep.html', {'form':form})

    else:
        form = CreateSalesRepForm()
        context = {'form':form}
        return render(request, 'salesrep/create_salesrep.html', context)


def update_salesrep(request, pk):
    srep = CreateSalesRep.objects.get(id=pk)
    form = CreateSalesRepForm(instance=srep)

    if request.method == "POST":
        form = CreateSalesRepForm(request.POST or None, instance=srep)
        if form.is_valid():
            form.save()
            messages.success(request, 'Successfully Updated!', 'alert-success')
            return redirect('sales_rep')
        else:
            return render(request, 'salesrep/update_salesrep.html', {'form':form})
    else:
        form = CreateSalesRepForm(instance=srep)
        return render(request, 'salesrep/update_salesrep.html', {'form':form})

Upvotes: 1

Views: 1095

Answers (2)

Victor
Victor

Reputation: 2909

You can validate in the forms:

class CreateSalesRepForm(forms.ModelForm): 
    class Meta: 
         model = CreateSalesRep 
         fields = ['name', 'office']
    def clean(self):
        cleaned_data = super().clean()
        office= cleaned_data.get("office")
        name = cleaned_data.get("name")
        duplicates = CreateSalesRep.objects.filter(office=office, name=name)
        if self.instance.pk:
            duplicates = duplicates.filter(pk=self.instance.pk)             
        if duplicates.exists():
            raise forms.ValidationError('Name already in office')

That being said, you could enforce this in the model/db level as well by adding the following to your CreateSalesRep model:

class CreateSalesRep(models.Model):
    ...

    class Meta:
        unique_together = ['office', 'name']

Upvotes: 1

user1933205
user1933205

Reputation: 362

You can try following inside your model class

class Meta:
        unique_together = [('office', 'name')]

Upvotes: 1

Related Questions