最近,我在一个问题(在 SO 上)中回答了关于调整 RegistrationForm 类的说明。在这个 RegistrationForm 中,您可以提示用户输入他的个人资料信息。您应该在 DefaultBackend 的 register 方法中处理此数据。
以下是代码示例:
from django.contrib.auth.models import User
from django_profiles.models import Profile
from django_registration.backends.default import DefaultBackend
from django_registration.forms import RegistrationForm
class ProfileRegistrationForm(RegistrationForm):
first_name = forms.CharField(max_length=30)
last_name = forms.CharField(max_length=30)
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
def save(self, commit=True):
user = super(ProfileRegistrationForm, self).save(commit=False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
if commit:
user.save()
profile = Profile(user=user)
profile.save()
return user
class ProfileRegistrationBackend(DefaultBackend):
def register(self, request, **kwargs):
form = ProfileRegistrationForm(request.POST)
if form.is_valid():
new_user = form.save()
return new_user
else:
return None
然后,您需要在 settings.py 中将 REGISTRATION_BACKEND 设置为您的新后端:
REGISTRATION_BACKEND = 'myproject.accounts.backends.ProfileRegistrationBackend'
方法二:
另一个选择是使用 django-allauth。这是一个库,它提供了一个通用的身份验证系统,它与 django-profiles 一起工作。使用 django-allauth,您可以在一个表单中收集所有用户信息,包括个人资料信息。
以下是代码示例:
from django.contrib.auth.models import User
from django_profiles.models import Profile
from django_allauth.forms import SignupForm
class ProfileSignupForm(SignupForm):
first_name = forms.CharField(max_length=30)
last_name = forms.CharField(max_length=30)
def save(self, request):
user = super(ProfileSignupForm, self).save(request)
profile = Profile(user=user)
profile.first_name = self.cleaned_data['first_name']
profile.last_name = self.cleaned_data['last_name']
profile.save()
return user
然后,您需要在 settings.py 中将 AUTHENTICATION_BACKENDS 设置为 django-allauth 的后端:
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'django_allauth.backends.ModelBackend',
)
您还需要在 settings.py 中将 SOCIALACCOUNT_FORMS 设置为您的新表单:
SOCIALACCOUNT_FORMS = {'signup': 'myproject.accounts.forms.ProfileSignupForm'}
使用这两种方法之一,您就可以将 django-registration 和 django-profiles 结合到一个 sign up 页面中。