为什么在django-registration中没有保存firstname和lastname字段?

时间:2014-03-21 19:33:27

标签: django django-admin django-registration django-users

我已在firstname表单中添加lastnamedjango-registration字段。但注册后我的admin page未显示已注册的first namelast name,但它是空白的,但会显示usernameemail address

请阅读以下docstring中提供的source code

以下是来自RegistrationForm

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

编辑:

    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)

2 个答案:

答案 0 :(得分:2)

<强>更新

您可以将create_inactive_user上的Registration/Models.py更改为这样......

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

请注意,它现在接受first_namelast_name。另请注意new_user.first_name = first_namenew_user.last_name = last_name

然后在Registration/backends/default/views.py上,您希望register看起来像这样......

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

请注意firstname(表单获取方式)和first_name(这是存储的内容,然后传递给create_inactive_user

答案 1 :(得分:0)

由于method signature

,因为提到的teewuane正在纠正之后,原因不起作用

考虑一下:

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

但在上面的register method中,您可以拨打电话:

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

由于send_email=Truedefault值,first_name获得的内容会以send_email传递,last_name传递给first_name 。因此,last_nameNone

修复很简单。只需按如下方式更改方法签名:

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