Проверка строки на наличие пробела возвращает ошибку в форме Django, даже если пробел отсутствует

В моей Django форме есть два поля, в которые пользователь должен вставить ровно одно слово. Поэтому, чтобы иметь некоторую валидацию в представлении, я создал следующий валидатор (идея заключается в поиске пробелов):

Views.py

[..]

if ' ' in poller_choice_one or poller_choice_two:
    raise ValidationError(('Limit your choice to one word'), code='invalid')
else:

[..]

Чтобы сделать его более надежным, я добавил опцию strip к полям формы, подлежащим валидации:

    # Poller Choices
    poller_choice_one = forms.CharField(label='Choice one', max_length=20, strip=True)
    poller_choice_two = forms.CharField(label='Choice two', max_length=20, strip=True)

Я перепробовал кучу вводов, начиная от однозначных цифр и заканчивая одиночными символами и т.д., всегда возникает ошибка валидации

Ваше заявление if интерпретируется как:

if (' ' in poller_choice_one) or (poller_choice_two):
    # …

сначала будет проверено, есть ли пробел в poller_choice_one. Если это не так, то он оценит истинность poller_choice_two. Истинность strинга имеет True, если он содержит хотя бы один символ. Поэтому условие if будет True с того момента, когда в poller_choice_one будет пробел или poller_choice_two будет хотя бы один символ.

Таким образом, вы должны переписать условие так:

if ' ' in poller_choice_one or ' ' in poller_choice_two:
    raise ValidationError(('Limit your choice to one word'), code='invalid')
# …

Используя regex, можно реализовать такой валидатор:

def validate(s0, s1):
    return re.match(" ", s0) or re.match(" ", s1)

Пример:

poller_choice_one = "hi"
poller_choice_two = "how are you?"

if not validate(poller_choice_one, poller_choice_two):
    raise ValidationError(('Limit your choice to one word'), code='invalid') 

Вернуться на верх