Переопределение класса django-registration
Поскольку мне нужно добавить капчу (django-recaptcha) в форму регистрации, я хочу переопределить класс RegistrationForm из модуля django-registration.
Я использую:
- django-registration==3.3
- django==4.1
- python(3.10)
Я попробовал несколько вариантов, показанных ниже.
forms.py
from django_registration.forms import RegistrationForm
class MyRegistrationForm(RegistrationForm):
age = forms.IntegerField()
class Meta(RegistrationForm.Meta):
fields = RegistrationForm.Meta.fields + ['age']
urls.py
from .forms import MyRegistrationForm
from django_registration.backends.activation.views import RegistrationView
path('accounts/register/', RegistrationView.as_view(form_class=MyRegistrationForm), name='registration_register')
registration_form.html
<form method="post" action=".">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="{% trans 'Submit' %}" />
</form>
Ничто не переопределяет форму. Я не понимаю, почему. То же самое с RegistrationView. Я не могу переопределить его по какой-то причине. Я уже некоторое время бьюсь над этим. Возможно, я уже упустил что-то очевидное. За помощь буду благодарен. Спасибо.
Решение:
Потому что в django-регистрации есть несколько RegistrationView
:
- backends\activation\views.py
- backends\one_step\views.py
- views.py
Учитывая, что RegistrationView
в \backends наследуется от views.py в корне. Атрибут form_class определяется в корневом представлении. Поэтому я нашел следующее решение:
#views.py
from .forms import *
from django_registration.views import RegistrationView
RegistrationView.form_class = MyRegistrationForm
#forms.py
from django_registration.forms import RegistrationForm
from captcha.fields import ReCaptchaField
class MyRegistrationForm(RegistrationForm):
captcha = ReCaptchaField()
captcha затем доступна в файле registration_form.html через {{form}}.
Переопределение RegistrationView
Пока не возникло проблем с переопределением вида, проблема, похоже, заключалась в том, в каком порядке были определены мои урлы.
path('accounts/register/', MyRegistrationView.as_view(), name='registration_register'),
path('accounts/', include('django_registration.backends.activation.urls')),
Мне пришлось разместить /accounts/register перед /accounts. Изначально я ожидал, что размещение /accounts/register после родных урлов будет перезаписывать любые другие урлы.