如何在自定义用户模型中保存用户信息?

时间:2014-05-20 14:43:05

标签: django facebook python-social-auth

我正在使用python-social-auth将用户登录到我的网站,这很好但我想使用自定义用户模型,不仅可以保存用户的基本信息,还可以获取他们的个人资料图片。

这是我的用户模型

def get_upload_file_name(instance, filename):
    return "%s_%s" % (str(time()).replace('.', '_'), filename)

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True)
    name = models.CharField(max_length=250, null=True, blank=True)
    profile_image = models.ImageField(upload_to = get_upload_file_name, null=True, blank=True)

    def __str__(self):
    return u'%s profile' % self.user.username

这是管道功能

def user_details(strategy, details, response, user=None, *args, **kwargs):
if user:
    if kwargs['is_new']:
        attrs = {'user': user}
        if strategy.backend.name == 'facebook':
            fb = {
                    'name': response['first_name']
                }
            new_user = dict(attrs.items() + fb.items())
            UserProfile.objects.create(
                **new_user
            )

        elif strategy.backend.name == 'google-oauth2':
            new_user = dict(attrs.items())
            UserProfile.objects.create(
                **new_user
            )

        elif strategy.backend.name == 'twitter':
            new_user = dict(attrs.items())
            UserProfile.objects.create(
                **new_user
            )

这是获取用户个人资料图片的另一个功能

def save_profile_picture(strategy, user, response, details, is_new=False,
                         *args, **kwargs):

    if is_new and strategy.backend.name == 'facebook':
        url = 'http://graph.facebook.com/{0}/picture'.format(response['id'])

        try:
            response = request('GET', url, params={'type': 'large'})
            response.raise_for_status()
        except HTTPError:
            pass
        else:
            S_user = setattr(UserProfile, "profile_image", "{0}_social.jpg".format(user.username), ContentFile(response.content))
            S_user.save()

我首先在facebook上尝试它,但我似乎无法在数据库中填充名称字段,并且在将其保存到默认的social-auth表之前我还必须登录两次。这两个函数都已添加到settings.py文件中,我还想知道如果重要的话它们是否重要,因为它们位于底部,是auth过程的最后一部分吗?

1 个答案:

答案 0 :(得分:0)

我想通了,因为我使用python3我应该在我的dict值上使用list()如下:attrs = dict(list(attrs.items())+ list(fb_data.items()))< / p>

而不是将图像保存在数据库中,最好只保存网址,节省大量空间