سؤال

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.

نصائح أخرى

The reason is not working now after correcting as teewuane mentioned is because of method signature

consider this:

def create_inactive_user(self, username, email, password,
                         site, send_email=True, first_name=None, last_name=None):

but in the register methodabove you make a call:

new_user = RegistrationProfile.objects.create_inactive_user(username, email, password, site, first_name, last_name)

since send_email=True is the default value, what ever first_name gets, is passed in as send_email and last_name gets passed to first_name. hence you will have last_name as None.

The fix is simple. Just change the method signature as follows:

def create_inactive_user(self, username, email, password,
                             site, first_name=None, last_name=None, send_email=True):
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top