Как разместить капчу на Django CreateView
Я работаю в существующей кодовой базе, которая использует Django Material. Есть CreateView
, определенный как:
class OurModelCreateView(LayoutMixin, CreateView):
model = OurModel
Этот вид получает много спам-регистраций и поэтому нуждается в капче. Я использую Django Recaptcha, и я установил несколько капч в прошлом. Однако я никогда не устанавливал их на общее представление. Если я создаю Django форму и определяю поле капчи в форме, как это всегда делалось в прошлом:
from captcha.fields import ReCaptchaField
from captcha.widgets import ReCaptchaV3
class OurModelForm(ModelForm):
captcha = ReCaptchaField(widget=ReCaptchaV3)
class Meta:
model = OurModel
exclude = ()
и затем указываю form_class = OurModelForm
на CreateView
, то получаю ошибку, говорящую, что fields
и form_class
не могут быть указаны одновременно. Это происходит потому, что LayoutMixin
в Django Material определяет fields
: https://github.com/viewflow/django-material/blob/294129f7b01a99832a91c48f129cefd02f2fe35f/material/base.py (внизу страницы)
Поэтому я думаю, что единственный способ сделать то, что мне нужно - это динамически вставить поле captcha
в форму.
Следующие две попытки не работают:
On the CreateView:
def get_form(self, form_class=None):
form = super(OurModelCreate, self).get_form(form_class)
form.fields['captcha'] = ReCaptchaField(widget=ReCaptchaV3)
return form
def fields(self):
fields = [super().fields(*args, **kwargs)]
fields['captcha'] = ReCaptchaField(widget=ReCaptchaV3)
return [field.field_name for field in fields]
В прошлом я динамически вставлял поля в формы Django (в __init__()
определения формы), но я не могу понять, что нужно переопределить в CreateView
или LayoutMixin
в Django Material, чтобы динамически вставить поле captcha
в форму. Любая помощь будет очень признательна.
После комментария @Alasdair выше, который указал мне на ответ, я решил эту проблему, удалив LayoutMixin
из CreateView
Django Material, создав Django форму с определенным полем captcha, а затем добавив в CreateView
form_class
для Django формы. Также см. мой последний комментарий выше. Это было нелогично для меня, пока я снова не посмотрел на код после второго комментария @Alasdair: использование LayoutMixin
на CreateView
не обязательно для того, чтобы layout = Layout(...)
на CreateView
работало.