如何在用户注册时将 django-registration 的参数传递给 django-profiles?如何在用户注册时将 django-registrati

55 阅读1分钟

最近,我在一个问题(在 SO 上)中回答了关于调整 RegistrationForm 类的说明。在这个 RegistrationForm 中,您可以提示用户输入他的个人资料信息。您应该在 DefaultBackend 的 register 方法中处理此数据。

huake_00015_.jpg 以下是代码示例:

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 页面中。