#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
было бы хорошей ставкой, поскольку это возвращает аргументы ключевого слова для передачи в экземпляр формы. Итак, в этом методе вам просто нужно добавить свой дополнительный параметр ко всему, что возвращается методом суперкласса.