Search code examples
pythondjangodjango-registration

Adding last_name , first_name to default django_registration(not redux)


I use django-registration 1.0(i am not sure about it, but i know it is the lates version)So, i want to make user enter his own first_name and last_name, during his registration, and store them with other(username, email, pass) to User model. So i created my own form ,in forms.py wich inherists from default django RegistrationForm, and add some extra fields

from registration.forms import RegistrationForm
from django.forms.fields import CharField
from django.contrib.auth.models import User

class UpdatedRegistrationForm(RegistrationForm):
    first_name = CharField(max_length=20)
    last_name = CharField(max_length=30)

class Meta:
    model = User
    fields = ('username', 'email', 'password1', 'password2')

def save(self, commit = True):
    user = super(UpdatedRegistrationForm, self).save(commit=False)
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']
    if commit:
        user.save()
        return user

Then i put my new form to urls.py

from django.conf.urls import include, url
from django.contrib import admin
from accounts.views import home_page, admin_panel
from accounts.forms import UpdatedRegistrationForm
from registration.views import RegistrationView

class RegistrationViewUniqueEmail(RegistrationView):
    form_class = UpdatedRegistrationForm

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^home/', home_page),
    url(r'^admin_pannel/',admin_panel),
    url(r'^register/$', RegistrationViewUniqueEmail.as_view(),               name='registration_register'),
url(r'', include('registration.backends.simple.urls')),
url(r'', include('social_auth.urls')),
]

When i run my server, and visit 127.0.0.1:8000/register/ i saw, that extra fields was added to my form register form

Then i press register, and i saw an error error 1 But i also saw that data was sent. So, i think that the reason may be in not override init() method. But i dont know how to do this, so may there is the another reason. Please, help me with this. errors:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/register/

Django Version: 1.8.5
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'social_auth',
 'accounts',
 'rest_framework')
Installed Middleware:
('accounts.middleware_log.MiddleWareLog',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-    packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request,     *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-    packages/django/views/generic/base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/registration/views.py" in     dispatch
  79.         return super(RegistrationView, self).dispatch(request,     *args, **kwargs)
File "/usr/local/lib/python2.7/dist-    packages/django/views/generic/base.py" in dispatch
  89.         return handler(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/registration/views.py" in     post
  35.             return self.form_valid(request, form)
File "/usr/local/lib/python2.7/dist-packages/registration/views.py" in     form_valid
  82.         new_user = self.register(request, **form.cleaned_data)
File "/usr/local/lib/python2.7/dist-packages/registration/views.py" in     register
  109.         raise NotImplementedError

Exception Type: NotImplementedError at /register/
Exception Value: 

Sorry for my very bad english.


Solution

  • If you are using the simple backend, you should subclass the view from that backend. You are currently using the base RegistrationView, which does not implement a register method.

    Instead of importing

    from registration.views import RegistrationView
    

    you should try

    from registration.backends.simple.views import RegistrationView
    

    django-registration will hopefully have a new release soon, but at the moment it hasn't had a new release for some time. The latest release might not work with recent versions of Django, in which case you might have more success with django-registration-redux.