Django: Как я могу проверить наличие комбинации двух полей? - PullRequest
0 голосов
/ 02 апреля 2020

Я использую Django Форма модели. Может ли кто-нибудь помочь мне проверить эти поля, чтобы получить ошибку поля с помощью clean ()?

Поле Имя нельзя повторить в одном офисе, только в другом.

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'})

        }

ОБНОВЛЕНО (form.py) --- Вот решение, вы можете использовать эти коды для проверки как вставки, так и обновления формы.

    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})

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы можете проверить в формах:

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')

При этом, вы также можете применить это на уровне модели / базы данных, добавив следующее к вашей CreateSalesRep модели:

class CreateSalesRep(models.Model):
    ...

    class Meta:
        unique_together = ['office', 'name']
1 голос
/ 02 апреля 2020

Вы можете попробовать следовать в вашей модели класса

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

...