Поле динамической формы в общем представлении в Django

#python #django #django-forms

#python #django #django-forms

Вопрос:

Я хочу показать дополнительное поле captcha после нескольких неудачных попыток отправки формы.

Это довольно просто при работе с обычной формой, но как можно достичь этого в общем представлении?

 # models.py

class MyCreateView(CreateView):
    form_class = MyForm
    model = MyModel

    def form_valid(self, form):
        if show_captcha:
            form = MyForm(form, captcha=True)
            return self.form_invalid(form)

# forms.py

class MyForm(ModelForm):

    def __init__(self, *args, **kwargs):
        captcha = kwargs.pop('captcha', None)
        super(MyForm, self).__init__(*args, **kwargs)

        if captcha:
            self.fields['captcha'] = ReCaptchaField()

    class Meta:
        model = MyModel
        fields = ['myfield']
  

Редактировать:

Я обновил свой код. Ошибка, которую я получаю, является:

'MyForm' object has no attribute 'get'

Оно указывает на мой шаблон, на строку:

 {{ form.as_p }}
  

Ответ №1:

Это ничем не отличается, если вы используете общее представление. Вам просто нужно переопределить правильный метод: в этом случае get_form_kwargs было бы хорошей ставкой, поскольку это возвращает аргументы ключевого слова для передачи в экземпляр формы. Итак, в этом методе вам просто нужно добавить свой дополнительный параметр ко всему, что возвращается методом суперкласса.