Как проверить уникальные данные в форме Django?

Я следую примерам, опубликованным в Django Formset Documents относительно пользовательского набора форм. проверка с небольшим изменением. Я нашел ошибку в примере, но не знаю, как ее исправить. Есть ли способ проверить уникальность данных, если поле ввода 1 из 3 не заполнено полностью? По-видимому, пустая форма записывается как «Нет», что вынуждает меня заполнить как минимум 2/3 набора полей ввода (имя/фамилия); в противном случае он будет зарегистрирован как дубликаты. Чтобы проиллюстрировать, что я имею в виду:

формы.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]

Поскольку есть дубликаты «Нет», это вызвало ошибку:

errors.append ('First and/or last name must be unique')

person dreamzboy    schedule 15.05.2015    source источник


Ответы (2)


Просто чтобы уточнить, вам не нужны пустые значения, так почему бы не сделать поля обязательными. Это полностью устранит проблему «Нет», поскольку в этом случае все поля будут обязательными.

В противном случае вы можете добавлять значения в список только в том случае, если они не пусты.

if firstname: 
    firstnames.append(firstname)
if lastname: 
    lastnames.append(lastname)
person Abhishek Agarwala    schedule 15.05.2015
comment
У меня были такие мысли, но, как вы можете видеть, пользователь должен заполнить все 8, 20, 100 полей, что делает непрактичным, если у него есть только один набор записей для ввода. Чтобы решить эту проблему, я установил поле ввода имени/фамилии в html-форме как обязательное. - person dreamzboy; 15.05.2015

Я думаю, что исправил это, добавив оператор if для проверки None.

if (firstname or lastname) is not None:
    firstnames.append (firstname)
    lastnames.append (lastname)
person dreamzboy    schedule 15.05.2015