繁体   English   中英

Django:检查用户输入是否不存在于数据库中并抛出ValidationError

[英]Django: Check if user input does not exist in db and throw ValidationError

我的表单中有一个IntegerField,用户可以在其中输入id 在提交表单之前,我想检查该id确实存在,如果不存在,我想向用户抛出“验证错误”(如果没有)。 我已经尝试了以下方法。 有没有更简单的方法可以做到这一点?

表格

class IncidentSearchForm(forms.Form):
    id = forms.IntegerField(label="ID",required=False)

    def search(self):
        id = self.cleaned_data.get('id')
        try:
            incident_id = Incident.object.filter(pk=id).exists()
        except Incident.DoesNotExist:
            raise forms.ValidationError('This does not exist.')

    query = Incident.objects.all()

    if id is not None:
        query = query.filter(id=self.cleaned_data.get('id'))

    return(query)

您可以在表单中执行以下操作:

def clean_id(self):
    """
    Cleaning id field
    """
    id = self.cleaned_data.get('id', None)
    if id:
        try:
            incident = Incident.objects.get(pk=id)
        except Incident.DoesNotExist():
            raise forms.ValidationError('This does not exist.')
    return id

根据文档

在表单子类上调用clean_()方法–其中用表单字段属性的名称替换。 此方法执行特定于该特定属性的任何清理,而与该字段的类型无关。 此方法未传递任何参数。 您将需要在self.cleaned_data中查询该字段的值,并记住这时它将是一个Python对象,而不是表单中提交的原始字符串(它将在cleaned_data中,因为常规字段clean()方法,上面的数据已经清除了一次)。

由于您需要一个自定义验证器(如您在注释中所述),因此可以为您的id字段创建一个validate_id_exists器。

validate_id_exists器检查是否存在具有给定idIncident对象。 如果不存在,则会引发ValidationError

from django.core.exceptions import ValidationError

def validate_id_exists(value):
    incident = Incident.objects.filter(id=value)
    if not incident: # check if any object exists
        raise ValidationError('This does not exist.') 

然后,您可以在表单中将此验证器指定为id字段的validators参数。

class IncidentSearchForm(forms.Form):
    id = forms.IntegerField(label="ID", required=False, validators=[validate_id_exists]) # specify your 'id' validator here

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM