0

I'm using signals to update gender, when social user change their gender on facebook.com. Signals work fine. I can sign up and login and gender is updating for fb users.

#app/models.py

@receiver(user_signed_up)
@receiver(user_logged_in)
def set_gender(sender, **kwargs):
    user = kwargs.pop('user')
    extra_data = user.socialaccount_set.filter(provider='facebook')[0].extra_data  
    gender = extra_data['gender']

    if gender == 'male':
        user.gender = u'M'
    elif gender == 'female':
        user.gender = u'F'
    user.save()

But I've noticed that for normal accounts when I try to sign up at /accounts/signup or sign in at /accounts/login I got this error:

Exception Type: IndexError
Exception Value: list index out of range

However normal users are succesfully saved to database, I only have this error after registration and login.

I think this cause the problem:

extra_data = user.socialaccount_set.filter(provider='facebook')[0].extra_data
HereHere
  • 734
  • 1
  • 7
  • 24

1 Answers1

0

You are correct, that is the problematic line. You probably want something more like:

from django.db.models import ObjectDoesNotExist

@receiver(user_signed_up)
@receiver(user_logged_in)
def set_gender(sender, **kwargs):
    user = kwargs.pop('user')
    try:
        extra_data = user.socialaccount_set.get(provider="facebook").extra_data
    except ObjectDoesNotExist:
        pass
    else:
        gender = extra_data['gender']

        if gender == 'male':
            user.gender = 'M'
        elif gender == 'female':
            user.gender = 'F'
        user.save()
Joey Wilhelm
  • 5,729
  • 1
  • 28
  • 42