我的表单中有一个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)
答案 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
在表单子类上调用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