我已在firstname
表单中添加lastname
和django-registration
字段。但注册后我的admin page
未显示已注册的first name
和last name
,但它是空白的,但会显示username
和email 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)
答案 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_name
和last_name
。另请注意new_user.first_name = first_name
和new_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
考虑一下:
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=True
是default
值,first_name
获得的内容会以send_email
传递,last_name
传递给first_name
。因此,last_name
为None
。
修复很简单。只需按如下方式更改方法签名:
def create_inactive_user(self, username, email, password,
site, first_name=None, last_name=None, send_email=True):