Как использовать разные формы в Django-Registration - PullRequest
6 голосов
/ 20 июня 2011

Django-Registration имеет несколько классов форм в файле forms.py. Одним из них является "class RegistrationFormTermsOfService (RegistrationForm) ..

Что я могу изменить в оставшейся части регистрационного кода Django, чтобы включить эту форму в моем процессе регистрации вместо RegistrationForm?

Ответы [ 5 ]

13 голосов
/ 30 мая 2013

Обновление принятого ответа в соответствии с Django 1.5 и последней версией django-registration:

в urls.py:

from registration.forms import RegistrationFormTermsOfService
from registration.backends.default.views import RegistrationView

urlpatterns = patterns('',
    url(r'^accounts/register/$', RegistrationView.as_view(form_class=RegistrationFormTermsOfService), name='registration_register'),
    # your other URLconf stuff follows ...
)

, затем обновите шаблон registration_form.html и добавьтеполе tos, например:

<p>
<label for="id_tos">I accept the terms of service</label>
{% if form.tos.errors %}
    <p class="errors">{{ form.tos.errors.as_text }}</p>
{% endif %}
{{ form.tos }}
</p>
5 голосов
/ 20 июня 2011

Вот практический пример использования пользовательской формы и серверной части, в которых задается имя пользователя == адрес электронной почты и запрашивается только адрес электронной почты при регистрации. Например, в my_registration.py

from django.conf import settings
from django.contrib.sites.models import RequestSite
from django.contrib.sites.models import Site

from registration import signals
from registration.forms import RegistrationForm
from registration.models import RegistrationProfile
from registration.backends.default import DefaultBackend

class EmailRegistrationForm(RegistrationForm):
    def __init__(self, *args, **kwargs):
        super(EmailRegistrationForm,self).__init__(*args, **kwargs)
        del self.fields['username']

    def clean(self):
        cleaned_data = super(EmailRegistrationForm,self).clean()
        if 'email' in self.cleaned_data:
            cleaned_data['username'] = self.cleaned_data['username'] = self.cleaned_data['email']
        return cleaned_data


class EmailBackend(DefaultBackend):
    def get_form_class(self, request):
        return EmailRegistrationForm

В my_registration_urls.py:

from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template

from registration.views import activate
from registration.views import register

urlpatterns = patterns('',
                   url(r'^activate/complete/$',
                       direct_to_template,
                       { 'template': 'registration/activation_complete.html' },
                       name='registration_activation_complete'),
                   # Activation keys get matched by \w+ instead of the more specific
                   # [a-fA-F0-9]{40} because a bad activation key should still get to the view;
                   # that way it can return a sensible "invalid key" message instead of a
                   # confusing 404.
                   url(r'^activate/(?P<activation_key>\w+)/$',
                       activate,
                       { 'backend': 'my_registration.EmailBackend' },
                       name='registration_activate'),
                   url(r'^register/$',
                       register,
                       { 'backend': 'my_registration.EmailBackend' },
                       name='registration_register'),
                   url(r'^register/complete/$',
                       direct_to_template,
                       { 'template': 'registration/registration_complete.html' },
                       name='registration_complete'),
                   url(r'^register/closed/$',
                       direct_to_template,
                       { 'template': 'registration/registration_closed.html' },
                       name='registration_disallowed'),
                   (r'', include('registration.auth_urls')),
                   )

Тогда в вашем ядре urls.py убедитесь, что вы включили:

url(r'^accounts/', include('my_registration_urls')),
5 голосов
/ 20 июня 2011

Вы можете просто зайти в свой urls.py и переопределить класс формы, выполнив что-то вроде:

from registration.forms import RegistrationFormTermsOfService

(r'^accounts/register/$', 'registration.views.register', {'form_class' : RegistrationFormTermsOfService}),
1 голос
/ 20 июня 2011

Вам нужно будет написать новую регистрационную форму где-нибудь в вашем проекте. Вы можете наследовать от существующей формы аутентификации, если вы просто расширяете новые поля. Затем вы захотите написать новый бэкэнд для обработки формы. Наконец, вам нужно написать свой собственный url и auth_urls и переопределить URL-адреса, чтобы переключать бэкэнд и форму аутентификации в представлениях, изменяя переменные, которые передаются в представление.

Полезно взломать источник, чтобы увидеть, как все работает. Я основываю свою структуру на исходном коде регистрации django, чтобы все было согласованно.

0 голосов
/ 08 января 2019

Что касается django 1.11 и django-registration 2.2, то есть некоторые обновленные импорты ... поэтому, если вы получаете "Нет модуля с именем 'registration'", это может быть проблемой ... Замените:

  • из registration.backends.hmac.views импорт RegistrationView от django_registration.backends.activation.views import RegistrationView

  • из registration.forms import RegistrationForm от django_registration.forms import RegistrationForm

  • include ('django_registration.backends.hmac.urls') в URL по include ('django_registration.backends.activation.urls')

Просто назвать несколько ...;)

Источник: https://django -registration.readthedocs.io / en / 3.0 / custom-user.html

...