Django - 将django-profiles(和django-registration)与django-facebook集成

时间:2013-07-14 02:25:42

标签: python django django-registration django-facebook django-profiles

[Django 1.5.1]

我已经为我的小网站设置了django-profilesdjango-registration,其方式涉及到'定制'注册后端,以便在注册期间,新用户一次性填写他们的用户名,密码和个人资料字段。但我现在试图允许用户使用Facebook登录并尝试使用django-facebook。据我了解,通过django-facebook登录Facebook登录将验证某人,但不会创建用户对象或配置文件对象。

所以我想到的想法是添加一个额外的个人资料字段,如果他们想要使用Facebook,它会保留用户的潜在Facebook ID(我相信这是唯一的)。然后,如果用户有个人资料,则强制检查每个模板,如果没有,则将他们引导到创建个人资料'页。然后,每当用户通过Facebook登录登录时,它以某种方式将他们的会话与匹配Facebook ID的相应简档对象(以及因此与简档对象相对应的用户对象)链接。我想我必须应用过滤器然后创建一个“信号”,但我不太清楚如何做到这一点。

但这听起来很复杂。我怎么能以正确的方式完成这项工作?

1 个答案:

答案 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,并将其他值保存到配置文件实例。

How to customize user profile when using django-allauth