Django:如何验证两个字段的组合存在性?

2024-06-24 12:24:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是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})

Tags: instancenameselfformreturnifrequestpost
2条回答

您可以尝试在模型类中执行以下操作

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

您可以在以下表单中进行验证:

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模型中,在model/db级别强制执行此操作:

class CreateSalesRep(models.Model):
    ...

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

相关问题 更多 >