How to use another form in Django-Registration

Django-Registration has several form classes in the forms.py file. One of them is the RegistrationFormTermsOfService (RegistrationForm) class.

What can I change in the rest of the Django registration code to include this form in the registration stream rather than RegistrationForm?

+6
source share
4 answers

You can just go into your urls.py and override the form class by doing something like:

 from registration.forms import RegistrationFormTermsOfService (r'^accounts/register/$', 'registration.views.register', {'form_class' : RegistrationFormTermsOfService}), 
+5
source

Updating the accepted answer to match Django 1.5 and the latest version of django registration:

in 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 ... ) 

then update the registration_form.html template and add the tos field, for example:

 <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> 
+13
source

Here is a practical example of using a user form and backend that sets the username == address and asks the user only for the email address when registering. In, for example. 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 

In 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')), ) 

Then, in your urls.py kernel urls.py make sure you include:

 url(r'^accounts/', include('my_registration_urls')), 
+5
source

You will need to write a new registration form somewhere in your project. You can inherit an existing authentication form if you simply extend new fields. Then you will want to write a new backend to process the form. Finally, you will need to write your own url and auth_urls and redefine the URLs to switch the backend and authentication form in the views, changing the variables that are passed to the view.

It is useful to break down the source to see how everything works. I base my structure on django registration source code to maintain consistency.

+1
source

Source: https://habr.com/ru/post/890944/


All Articles