【问题标题】:How to Check for Unique Data in Django Form?如何检查 Django 表单中的唯一数据?
【发布时间】:2015-07-26 23:42:12
【问题描述】:

我正在关注Django Formset Documents 上发布的关于自定义表单集验证的示例,并稍作修改。我在示例中发现了一个缺陷,但不确定如何修复它。如果 3 个输入字段中的 1 个未完全填写,有没有办法检查数据的唯一性?显然,空表格被记录为“无”,这迫使我至少填写 2/3 组输入字段(名字/姓氏);否则,它将注册为重复项。为了说明我的意思:

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

只填写了一组名字/姓氏,这是控制台的结果。

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')

【问题讨论】:

    标签: python django forms django-forms formset


    【解决方案1】:

    我想我通过添加一个“if”语句来检查无。

    if (firstname or lastname) is not None:
        firstnames.append (firstname)
        lastnames.append (lastname)
    

    【讨论】:

      【解决方案2】:

      澄清一下,您不需要空白值,所以为什么不将这些字段设为必填项。这将完全消除 None 问题,因为所有字段都是必需的。

      否则,您只能将不为空的值添加到列表中

      if firstname: 
          firstnames.append(firstname)
      if lastname: 
          lastnames.append(lastname)
      

      【讨论】:

      • 我有这样的想法,但正如您所见,用户需要填写所有 8、20、100 个字段,如果他们只有一组条目要输入,这将不切实际。为了解决这个问题,我将 html 表单中的名字/姓氏输入字段设置为“必需”。
      猜你喜欢
      • 2013-06-25
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2021-07-08
      • 2019-03-09
      • 2022-12-04
      • 1970-01-01
      • 2019-08-24
      相关资源
      最近更新 更多