[英]Django does not throw ValidationError when required fields are not present
[英]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
器检查是否存在具有给定id
的Incident
对象。 如果不存在,则会引发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.