Переопределение класса 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 после родных урлов будет перезаписывать любые другие урлы.

Вернуться на верх