Django social_auth自定义用户模型FacebookBackend解释

Django social_auth自定义用户模型FacebookBackend解释,django,django-models,django-socialauth,django-facebook,Django,Django Models,Django Socialauth,Django Facebook,我第一次尝试使用social_auth(omab),我发现没有一个可以用来存储基本facebook用户数据的工作示例。正如social_auth文档中所解释的那样,身份验证工作正常,用户创建没有问题,但我还需要存储性别和区域设置。它们都属于facebook的基本用户数据,因此它们一直都在facebook的回复中 我正在使用Django 1.4、Python2.7和最新的social_auth。所以我尝试在settings.py文件中使用SOCIAL\u AUTH\u USER\u MODEL='

我第一次尝试使用social_auth(omab),我发现没有一个可以用来存储基本facebook用户数据的工作示例。正如social_auth文档中所解释的那样,身份验证工作正常,用户创建没有问题,但我还需要存储
性别
区域设置
。它们都属于facebook的基本用户数据,因此它们一直都在facebook的回复中

我正在使用Django 1.4、Python2.7和最新的social_auth。所以我尝试在settings.py文件中使用
SOCIAL\u AUTH\u USER\u MODEL='myapp.UserProfile'
,MODEL.py是:

#!/usr/bin/python
#-*- coding: UTF-8 -*-
from django.db import models
from django.contrib.auth.models import User
from django.db.models import signals
import datetime
from datetime import timedelta
from django.db.models.signals import post_save
from social_auth.signals import pre_update
from social_auth.backends.facebook import FacebookBackend


class CustomUserManager(models.Manager):
    def create_user(self, username, email):
        return self.model._default_manager.create(username=username)

class UserProfile(models.Model):
    gender = models.CharField(max_length=150, blank=True)
    locale = models.CharField(max_length=150, blank=True)
    #social_auth requirements
    username   = models.CharField(max_length=150)
    last_login = models.DateTimeField(blank=True)
    is_active  = models.BooleanField()

    objects = CustomUserManager()

    class Meta:
        verbose_name_plural = 'Profiles'

    def __unicode__(self):
        return self.username

    def get_absolute_url(self):
        return '/profiles/%s/' % self.id

    def facebook_extra_values(sender, user,response, details, **kwargs):     
        profile = user.get_profile()
        current_user = user 
        profile, new = UserProfile.objects.get_or_create(user=current_user)

        profile.gender = response.get('gender')
        profile.locale = response.get('locale')
        profile.save()
        return True

    pre_update.connect(facebook_extra_values, sender=FacebookBackend, weak = False, dispatch_uid = 'facebook_extra_values_user')
在settings.py中,我正在定义管道

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user',
    #'social_auth.backends.pipeline.associate.associate_by_email',
    'social_auth.backends.pipeline.user.create_user',
    'social_auth.backends.pipeline.social.associate_user',
    'social_auth.backends.pipeline.social.load_extra_data',
    'social_auth.backends.pipeline.user.update_user_details',
    'social_auth.backends.pipeline.misc.save_status_to_session',
)
但在上面我得到了错误
AssertionError:ForeignKey(无)无效。ForeignKey的第一个参数必须是模型、模型名称或字符串“self”

我还尝试使用
AUTH\u PROFILE\u MODULE='myapp.UserProfile'
来扩展user.model,它运行良好,但不了解在创建UserProfile时如何填充所需的数据。是否有人可以为此问题放置工作代码


谢谢

有几种方法可以将其存档,哪些方法更适合您的项目取决于您自己。当然,以下是可用选项列表:

  • 定义此设置
    FACEBOOK\u EXTRA\u DATA=('gender','locale')
    ,这些值将在
    UserSocialAuth
    实例中可用,以使它们只需执行
    user.social\u auth.get(provider='FACEBOOK')。EXTRA\u DATA['gender']
    ['locale']
    。这是可能的,因为信息在基本用户数据响应中可用

  • 使用用户配置文件存储此数据(请检查)。然后只需添加一个将值存储在配置文件实例中的

  • 创建一个自定义用户模型,
    SOCIAL\u AUTH\u user\u model='myapp.CustomUser'
    ,然后再次添加一个在用户实例中存储值的自定义管道条目


  • 在IMO中,1号并不是最好的解决方案,因为一个用户可以连接多个Facebook帐户,这可能会造成混乱。对于Django1.4和更低版本,数字2是好的,但从Django1.5开始就不推荐使用,这是需要考虑的。第三个问题在我看来有点麻烦。

    谢谢你的回答,但如果我尝试第三个解决方案,我不知道该怎么做。自定义用户模型是我的UserProfile类,但如何向其中添加管道。在这种情况下,您有一个配置文件模型,所以您的解决方案是第2个。检查关于管道的文档,但基本上创建一个类似于此的函数,即假设您的概要文件模型具有性别和区域设置字段。