如何检查 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)