Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django验证器:检查数据库中的两个字段值是否具有相同的id_Django_Forms_Validation - Fatal编程技术网

Django验证器:检查数据库中的两个字段值是否具有相同的id

Django验证器:检查数据库中的两个字段值是否具有相同的id,django,forms,validation,Django,Forms,Validation,我是Django的新手,我的表单有两个字段: 客户名称和账单编号。 我创建了一个验证器,用于测试数据库表(称为bills)中是否已经存在票据编号。 但是现在我需要将这个验证器转换为另一个验证器,在前面的测试之外,如果客户机名称存在于同一个表行中(更简单:如果客户机名称和账单编号具有相同的pk)。 验证器: def validate_url(value): try: entry=facture_ventes.objects.get(numfac=value) exc

我是Django的新手,我的表单有两个字段: 客户名称和账单编号。 我创建了一个验证器,用于测试数据库表(称为bills)中是否已经存在票据编号。 但是现在我需要将这个验证器转换为另一个验证器,在前面的测试之外,如果客户机名称存在于同一个表行中(更简单:如果客户机名称和账单编号具有相同的pk)。 验证器:

def validate_url(value):
    try:
        entry=facture_ventes.objects.get(numfac=value)
    except ObjectDoesNotExist:
        entry = None
    if entry is not None:
        factexist=facture_ventes.objects.all().filter(id=entry.id).count()
        if factexist  is not None:
            raise ValidationError("Numéro de Facture déja saisi ! ")
表格:

class SubmitUrlForm(forms.Form):
    numfacture=forms.CharField(label='Submit Form', validators=[validate_url])
以下是数据库表:


请帮忙,因为我知道验证器不能返回值,所以我被困在这里。谢谢

您可以尝试使用get\u或\u create()方法:

obj,created=MyModel.objects.get_或_create(first_name='Angus',last_name='Young') 这可能会返回:

  • 如果存在:
obj
:数据库中的对象

已创建
:False

  • 如果它不存在:
obj
:新创建的对象


created
:True

这不是验证器的工作,而是表单的
clean
方法的工作

def clean(self):
    numfac = self.cleaned_data.get('numfacture')
    try:
        entry=facture_ventes.objects.get(numfac=numfac)
    except ObjectDoesNotExist:
        entry = None
    if entry is not None:
        factexist=facture_ventes.objects.all().filter(id=entry.id).count()
        if factexist is not None:
            raise forms.ValidationError("Numéro de Facture déja saisi ! ")
        if entry.client_name == self.cleaned_data.get('client_name'): # or whatever
            raise forms.ValidationError("Facture avec ce numéro et cliente existe déjà")

非常感谢你的回答。好的,我明白了,我会测试一下。我想clean方法应该在我的视图文件中?是吗?不,这是表单上的一个方法。非常感谢你帮了我一个忙。我有一个问题,如果我将第二个字段转换为ModelChoiceField,会有任何修改吗?先谢谢你