Как разместить капчу на 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 работало.