I have included field for firstname
and lastname
in django-registration
form. but After registration my admin page
is not showing the registered first name
and last name
, it is blank, but the username
and email address
are shown.
Please read the docstring
as provided in source code
below:
Here is the code for RegistrationForm
from django-registration
from django.contrib.auth.models import User
from django import forms
from django.utils.translation import ugettext_lazy as _
class RegistrationForm(forms.Form):
"""
Form for registering a new user account.
Validates that the requested username is not already in use, and
requires the password to be entered twice to catch typos.
Subclasses should feel free to add any additional validation they
need, but should avoid defining a ``save()`` method -- the actual
saving of collected user data is delegated to the active
registration backend.
"""
required_css_class = 'required'
username = forms.RegexField(regex=r'^[\w.@+-]+$',
max_length=30,
label=_("Username"),
error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
email = forms.EmailField(label=_("E-mail"))
password1 = forms.CharField(widget=forms.PasswordInput,
label=_("Password"))
password2 = forms.CharField(widget=forms.PasswordInput,
label=_("Password (again)"))
first_name=forms.RegexField(regex=r'^[\w.@+-]+$',
max_length=30,
label=_("first name"),
error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
last_name=forms.RegexField(regex=r'^[\w.@+-]+$',
max_length=30,
label=_("last name"),
error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
def clean_username(self):
"""
Validate that the username is alphanumeric and is not already
in use.
"""
existing = User.objects.filter(username__iexact=self.cleaned_data['username'])
if existing.exists():
raise forms.ValidationError(_("A user with that username already exists."))
else:
return self.cleaned_data['username']
def clean(self):
"""
Verifiy that the values entered into the two password fields
match. Note that an error here will end up in
``non_field_errors()`` because it doesn't apply to a single
field.
"""
if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
if self.cleaned_data['password1'] != self.cleaned_data['password2']:
raise forms.ValidationError(_("The two password fields didn't match."))
return self.cleaned_data
EDIT:
def register(self, request, **cleaned_data):
username, email, password,first_name,last_name = (cleaned_data['username'], cleaned_data['email'], cleaned_data['password1'],
cleaned_data['first_name'],cleaned_data['last_name'])
if Site._meta.installed: # @UndefinedVariable
site = Site.objects.get_current()
else:
site = RequestSite(request)
new_user = RegistrationProfile.objects.create_inactive_user(username, email,
password, site, first_name,last_name)
signals.user_registered.send(sender=self.__class__,
user=new_user,
request=request)
return new_user
def create_inactive_user(self, username, email, password,
site, send_email=True,first_name=None, last_name=None):
new_user = User.objects.create_user(username, email, password)
if first_name:
new_user.first_name=first_name
if last_name:
new_user.last_name=last_name
new_user.is_active = False
new_user.save()
registration_profile = self.create_profile(new_user)
if send_email:
registration_profile.send_activation_email(site)
return new_user
create_inactive_user = transaction.commit_on_success(create_inactive_user)
UPDATE:
You could change create_inactive_user
on Registration/Models.py
to look like this...
def create_inactive_user(self, username, email, password,
site, send_email=True, first_name=None, last_name=None):
"""
Create a new, inactive ``User``, generate a
``RegistrationProfile`` and email its activation key to the
``User``, returning the new ``User``.
By default, an activation email will be sent to the new
user. To disable this, pass ``send_email=False``.
"""
new_user = User.objects.create_user(username, email, password)
new_user.is_active = False
new_user.first_name = first_name
new_user.last_name = last_name
new_user.save()
registration_profile = self.create_profile(new_user)
if send_email:
registration_profile.send_activation_email(site)
return new_user
Notice it is now accepting first_name
and last_name
. Also notice the new_user.first_name = first_name
and new_user.last_name = last_name
Then on Registration/backends/default/views.py
you'll want register
to look like this...
def register(self, request, **cleaned_data):
username, email, password, first_name, last_name = cleaned_data['username'], cleaned_data['email'], cleaned_data['password1'], cleaned_data['firstname'], cleaned_data['lastname']
if Site._meta.installed:
site = Site.objects.get_current()
else:
site = RequestSite(request)
new_user = RegistrationProfile.objects.create_inactive_user(username, email, password, site, first_name, last_name)
signals.user_registered.send(sender=self.__class__,
user=new_user,
request=request)
return new_user
Notice the firstname
(which is how your form is getting it) and first_name
(which is what it is being stored as then passed to the create_inactive_user
.