[Django 1.5.1]
我已经为我的小网站设置了django-profiles
和django-registration
,其方式涉及到'定制'注册后端,以便在注册期间,新用户一次性填写他们的用户名,密码和个人资料字段。但我现在试图允许用户使用Facebook登录并尝试使用django-facebook
。据我了解,通过django-facebook
登录Facebook登录将验证某人,但不会创建用户对象或配置文件对象。
所以我想到的想法是添加一个额外的个人资料字段,如果他们想要使用Facebook,它会保留用户的潜在Facebook ID(我相信这是唯一的)。然后,如果用户有个人资料,则强制检查每个模板,如果没有,则将他们引导到创建个人资料'页。然后,每当用户通过Facebook登录登录时,它以某种方式将他们的会话与匹配Facebook ID的相应简档对象(以及因此与简档对象相对应的用户对象)链接。我想我必须应用过滤器然后创建一个“信号”,但我不太清楚如何做到这一点。
但这听起来很复杂。我怎么能以正确的方式完成这项工作?
答案 0 :(得分:0)
以下是我建议你做的事情。取消django-facebook并查看django-allauth。它将处理帐户(注册,逻辑,连接社交帐户)。
另外,django-profiles对我来说有很多1.5+的问题,我不打扰它,而是使用django-allauth无法处理的任何其他字段创建我自己的配置文件应用程序和UserProfile模型。 / p>
我的一个实现
的示例class UserProfile(models.Model):
user = models.OneToOneField(User)
default_address = models.OneToOneField(Address, blank=True, null=True)
default_tshirt_size = models.CharField(blank=True, null=True, choices=constants.tshirt_sizes, max_length=50)
default_shoe_size = models.CharField(blank=True, null=True, choices=constants.shoe_sizes, max_length=50)
您的用户个人资料模型应指向allauth正在使用的相同用户模型。
from allauth.utils import get_user_model
User = get_user_model()
这是一个简洁的方法,我用它来自动创建用户的个人资料,如果它还没有。
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
然后使用save()方法创建一个注册表单类,该方法将用户作为参数。在您的设置文件中链接到此类。
ACCOUNT_SIGNUP_FORM_CLASS = 'yourproject.yourapp.forms.SignupForm'
有关相关示例,请参阅此帖子,当然除了您的实现之外,您可能希望在此时基于user.id获取UserProfile,并将其他值保存到配置文件实例。