M
M
Mike2018-11-18 03:48:27
Django
Mike, 2018-11-18 03:48:27

Why can't I save a link to the Facebook user's avatar in the model?

DRF and Django-Allauth. I get a link to a Facebook user avatar, then I try to save it, profile.save()but I get

return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: user_profile.user_id

my 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=256, blank=True, null=True)

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

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


// GET PICTURE FROM SOCIAL
@receiver(user_logged_in)
def set_initial_user_names(request, user, sociallogin=None, **kwargs):
    preferred_avatar_size_pixels = 256

    picture_url = "http://www.gravatar.com/avatar/{0}?s={1}".format(
        hashlib.md5(user.email.encode('UTF-8')).hexdigest(),
        preferred_avatar_size_pixels
    )

    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_id=user.id, avatar_url=picture_url)

    profile.save()


@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()

Answer the question

In order to leave comments, you need to log in

1 answer(s)
D
Denis Ivlev, 2018-11-20
@ivlevdenis_ru

Do checks for existence or use get_or_create.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question