Django:检查db中是否存在用户输入并抛出ValidationError

时间:2015-07-31 14:16:00

标签: django forms validation

我的表单中有一个IntegerField,用户可以在其中输入id。在提交表单之前,我想检查id是否确实存在,如果它没有,我想要向用户提出验证错误,如果它没有。我尝试了以下方法。有更简单的方法吗?

forms.py

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)

2 个答案:

答案 0 :(得分:1)

你可以在表格中做这样的事情:

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

根据documentation

  

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

答案 1 :(得分:1)

由于您需要自定义验证程序(如评论中所述),因此您可以为validate_id_exists字段创建id验证程序。

validate_id_exists验证程序检查是否存在具有给定Incident的{​​{1}}对象。如果它不存在,则会引发id

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.') 字段的validators参数。

id