我无法保存来自Facebook帐户的图片链接

时间:2019-02-04 18:36:59

标签: django

我正在尝试从Facebook帐户获取图片链接,但收到此消息:

django.db.utils.IntegrityError: UNIQUE constraint failed: 
user_profile.user_id

我可以在控制台中看到图片链接,但是无法将其保存在用户个人资料中。

当我尝试这样做时,这是我的model.py。

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

from allauth.account.signals import user_signed_up, user_logged_in


from allauth.socialaccount.models import SocialAccount
import hashlib


try:
    from django.utils.encoding import force_text
except ImportError:
    from django.utils.encoding import force_unicode as force_text


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, 
    related_name='userprofile')

    city = models.CharField(max_length=30, blank=True)
    about = models.TextField(blank=True)
    avatar = models.ImageField(upload_to='avatars/', verbose_name='Images', 
    blank=True)

    sound = models.BooleanField(default=False)
    points = models.DecimalField(max_digits=4, decimal_places=2, default=0.00)
    energy = models.IntegerField(default=0)
    avatar_url = models.URLField(max_length=500, blank=True, null=True)

    class Meta:
        db_table = 'user_profile'
        verbose_name = 'Profile'
        verbose_name_plural = 'Profiles'

    def __str__(self):
        return str(self.user)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.userprofile.save()


#@receiver(user_logged_in)
@receiver(user_signed_up)
def set_initial_user_names(request, user, sociallogin=None, **kwargs):
    preferred_avatar_size_pixels = 25

    if sociallogin:
        if sociallogin.account.provider == 'facebook':     
            picture_url = "http://graph.facebook.com/{0}/picture?width={1}&height={1}".format(
                sociallogin.account.uid, preferred_avatar_size_pixels)

        profile = UserProfile(user=user, avatar_url=picture_url)
        #profile = UserProfile.objects.get(user=user)
        #profile.avatar_url = picture_url
        profile.save()

如果最后我是这样的话:

    #profile = UserProfile(user=user, avatar_url=picture_url)
    profile = UserProfile.objects.get(user=user)
    profile.avatar_url = picture_url
    profile.save()

我在控制台中未收到任何消息,但用户个人资料未保存。

1 个答案:

答案 0 :(得分:1)

此行profile = UserProfile(user=user, avatar_url=picture_url)引起了问题,因为您试图创建一个已经存在的配置文件的新实例。由于您的OneToOne模型中的UserProfile字段,配置文件变得唯一。

并且您不需要从数据库中获取用户,因为set_initial_user_names函数已经将注册用户作为参数传递给您。因此,user.userprofile就是这样。然后,您可以使用新信息更新用户。

我也建议您从提供的网址下载图片,然后将其保存在模型的图片字段中,如下所示:

 import urllib
 from django.core.files import File 

 # for python 2: result = urllib.urlretrieve(picture_url)[0]      
 result = urllib.request.urlretrieve(picture_url)[0] # for python 3
 user.userprofile.avatar.save('test.jpg', File(open(result, 'rb')))
 user.userprofile.save()