如何检查 Django 表单中的唯一数据?
How to Check for Unique Data in Django Form?
我正在按照 Django Formset Documents 上发布的关于自定义表单集验证的示例进行轻微修改。我在示例中发现了一个缺陷,但不确定如何修复它。如果 3 个输入字段中的 1 个未完全填写,有没有办法检查数据的唯一性?显然,空表格被记录为 "None" 这迫使我至少填写 2/3 组输入字段 (firstname/lastname);否则,它将注册为重复项。为了说明我的意思:
forms.py
class UserInfo (forms.Form):
first_name = forms.CharField (max_length = 20, required = False)
last_name = forms.CharField (max_length = 20, required = False)
class BaseUserInfoFormSet (BaseFormSet):
def clean (self):
if any (self.errors):
return
firstnames = []
lastnames = []
errors = []
for form in self.forms:
firstname = form.cleaned_data.get ('first_name')
lastname = form.cleaned_data.get ('last_name')
if ((firstname in firstnames) or (lastname in lastnames)) and len (errors) < 2:
errors.append ('First and/or last name must be unique')
if ((firstname == '') or (lastname == '')) and len (errors) < 2:
errors.append ('First and/or last name cannot be blanked')
firstnames.append (firstname)
lastnames.append (lastname)
print ('First Name List: ', firstnames)
print ('Last Name List: ', lastnames)
if errors:
raise forms.ValidationError (errors)
return self.cleaned_data
仅填写了一组 firstname/lastname,这是控制台的结果。
First Name List: ['John']
Last Name List: ['Doe']
First Name List: ['John', None]
Last Name List: ['Doe', None]
First Name List: ['John', None, None]
Last Name List: ['Doe', None, None]
因为有重复的"None",所以触发了错误:
errors.append ('First and/or last name must be unique')
澄清一下,您不需要空白值,所以为什么不将字段设为必填。这将完全消除 None 问题,因为所有字段都将是必需的。
否则,您只能将不为空的值添加到列表中
if firstname:
firstnames.append(firstname)
if lastname:
lastnames.append(lastname)
我想我通过添加 'if' 语句来检查 None 来修复它。
if (firstname or lastname) is not None:
firstnames.append (firstname)
lastnames.append (lastname)
我正在按照 Django Formset Documents 上发布的关于自定义表单集验证的示例进行轻微修改。我在示例中发现了一个缺陷,但不确定如何修复它。如果 3 个输入字段中的 1 个未完全填写,有没有办法检查数据的唯一性?显然,空表格被记录为 "None" 这迫使我至少填写 2/3 组输入字段 (firstname/lastname);否则,它将注册为重复项。为了说明我的意思:
forms.py
class UserInfo (forms.Form):
first_name = forms.CharField (max_length = 20, required = False)
last_name = forms.CharField (max_length = 20, required = False)
class BaseUserInfoFormSet (BaseFormSet):
def clean (self):
if any (self.errors):
return
firstnames = []
lastnames = []
errors = []
for form in self.forms:
firstname = form.cleaned_data.get ('first_name')
lastname = form.cleaned_data.get ('last_name')
if ((firstname in firstnames) or (lastname in lastnames)) and len (errors) < 2:
errors.append ('First and/or last name must be unique')
if ((firstname == '') or (lastname == '')) and len (errors) < 2:
errors.append ('First and/or last name cannot be blanked')
firstnames.append (firstname)
lastnames.append (lastname)
print ('First Name List: ', firstnames)
print ('Last Name List: ', lastnames)
if errors:
raise forms.ValidationError (errors)
return self.cleaned_data
仅填写了一组 firstname/lastname,这是控制台的结果。
First Name List: ['John']
Last Name List: ['Doe']
First Name List: ['John', None]
Last Name List: ['Doe', None]
First Name List: ['John', None, None]
Last Name List: ['Doe', None, None]
因为有重复的"None",所以触发了错误:
errors.append ('First and/or last name must be unique')
澄清一下,您不需要空白值,所以为什么不将字段设为必填。这将完全消除 None 问题,因为所有字段都将是必需的。
否则,您只能将不为空的值添加到列表中
if firstname:
firstnames.append(firstname)
if lastname:
lastnames.append(lastname)
我想我通过添加 'if' 语句来检查 None 来修复它。
if (firstname or lastname) is not None:
firstnames.append (firstname)
lastnames.append (lastname)