Django: объект list не является вызываемым в forms.py

Я пытаюсь добавить валидатор RegexValidator в контактную форму (forms.py), чтобы предотвратить добавление спамерами ссылок http:// и https:// в сообщение.

Я включил from django.core.validators import RegexValidator в начало forms.py.

Этот пример general_message работает нормально, когда не используется валидатор:

general_message = forms.CharField(label='General message*', required=True, widget=forms.Textarea(
        attrs={'class': 'form-control', 'maxlength': '1000', 'rows': 8}
    ))

Но я получаю ошибку 'list’ object is not callable в примере ниже:

general_message = forms.CharField(label='General message*', required=True, widget=forms.Textarea, validators=[RegexValidator(regex=r'http(s)?|HTTP(s)?', message="No http or https allowed", code="invalid")] (
        attrs={'class': 'form-control', 'maxlength': '1000', 'rows': 8} ))

Похоже, что я правильно расставил скобки и круглые скобки. Что вызывает ошибку?

Прежде всего, я предлагаю использовать TextField вместо CharField. Общий CharField предназначен для небольшого фрагмента текста, а TextField - для большого текста.

Если вы настаиваете на использовании CharField, вы должны отформатировать эту длинную строку кода таким образом, чтобы можно было понять, что она делает. Например:

general_message = forms.CharField(
    label='General message*', 
    required=True,
    widget=forms.Textarea, 
    validators=[
        RegexValidator(
            regex=r'http(s)?|HTTP(s)?',
            message="No http or https allowed",
            code="invalid"
        )
    ]
    (
        attrs={
            'class': 'form-control',
            'maxlength': '1000',
            'rows': 8
        }
    )
)

Теперь вы видите, что у вас есть () сразу после [] для `validators. Это выглядит как вызов функции. Но это не имеет никакого смысла, поскольку вы не можете вызвать список, как говорит ошибка.

Используя последовательное форматирование и отступы, вы можете легко избежать подобных проблем. Формат, который я показал выше, является одним из многих стилей, которые могут работать. Просто выберите что-то одно и придерживайтесь его.

Чтобы исправить это, вам нужно просто переместить код так, чтобы он выстроился правильно. Похоже, что вы поставили validators в неправильном месте между Textarea и () для вызова конструктора. Правильный код должен быть таким:

general_message = forms.CharField(
    label='General message*', 
    required=True,
    widget=forms.Textarea(
        attrs={
            'class': 'form-control',
            'maxlength': '1000',
            'rows': 8
        }
    ),
    validators=[
        RegexValidator(
            regex=r'http(s)?|HTTP(s)?',
            message="No http or https allowed",
            code="invalid"
        )
    ]
)
Вернуться на верх