Как добавить ошибки в форму "non_field_errors" из вида? - PullRequest
0 голосов
/ 16 июля 2011

Вот моя ситуация. У меня есть веб-страница для пользователей, чтобы создавать свои собственные учетные записи. На этой странице есть reCaptcha для предотвращения ботов. Когда пользователь нажимает «Отправить», проверка reCaptcha выполняется до создания соответствующей формы в соответствующем представлении. Допустим, пользовательский ввод не прошел проверку reCaptcha. Как мне сообщить об этой ошибке обратно пользователю? Должен ли я добавить ошибку в «non_field_errors» формы? Если да, то как правильно это сделать?

Мой текущий подход - передать список ошибок, включая ошибку reCaptcha, из представления в конструктор формы и добавить ошибки в non_field_errors формы в init (). Однако способ добавления ошибок к форме non_field_errors ( ссылка на сообщение ) недостаточен. Если в списке передано несколько ошибок, последняя всегда перезаписывает предыдущую. Как я могу добавить ошибки в non_field_errors формы вместо того, чтобы каждый раз перезаписывать существующую?

views.py:

def create_account(request):
    """ User sign up form """
    if request.method == 'POST':
        recaptcha_result = check_recaptcha(request)
        if recaptcha_result.is_valid:
            ...
        else:
            non_form_errors = ['Incorrect reCaptcha word entered. Please try again.'];
            signup_form = SignUpForm(request.POST, non_form_errors=non_form_errors)
    else:
        signup_form = SignUpForm()

    public_key = settings.RECAPTCHA_PUBLIC_KEY
    script = displayhtml(public_key=public_key)

    return render(request, 'create_account.html', 
        {'signup_form': signup_form, 'script': script})

forms.py:

class SignUpForm(UserCreationForm):
""" Require email address when a user signs up """
email = forms.EmailField(label='Email address', max_length=75, widget=TextInput(attrs={'size': 30}))

def __init__(self, *args, **kwargs):
    non_form_errors = []
    if kwargs.has_key('non_form_errors'):
        non_form_errors.append(kwargs.pop('non_form_errors'))

    super(SignUpForm, self).__init__(*args, **kwargs)

    for err in non_form_errors:
        self.errors['__all__'] = self.error_class(err)

Ответы [ 2 ]

0 голосов
/ 18 июля 2011

Во-первых, я хотел бы поблагодарить @lazerscience за указание лучшего направления для решения моей проблемы.Однако я не принял приложение django-recaptcha , как было предложено.

В итоге я использовал фрагмент кода от Марко Фуччи.Вкратце, этот фрагмент кода поможет вам создать настраиваемое поле формы (и виджет) для ReCaptcha.Как только это будет сделано, все, что вам нужно сделать, чтобы ReCaptcha в вашей форме, так же просто, как добавить одну строку в определение формы.

0 голосов
/ 17 июля 2011

Попробуйте это в forms.py:

def __init__(self, *args, **kwargs):
    non_form_errors = []
    if kwargs.has_key('non_form_errors'):
        non_form_errors.append(kwargs.pop('non_form_errors'))

    super(SignUpForm, self).__init__(*args, **kwargs)
    errors = self.errors.get('__all__', [])
    for err in non_form_errors:
        errors.append(self.error_class(err))
    self.errors['__all__'] = errors
...