IndexError,列表索引超出范围。 Django-allauth信号 [英] IndexError, list index out of range. Django-allauth signals

查看:76
本文介绍了IndexError,列表索引超出范围。 Django-allauth信号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当社交用户在facebook.com上更改性别时,我正在使用信号来更新性别。
信号正常。我可以注册并登录,并且fb用户的性别正在更新。

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

但是我注意到,对于普通帐户,当
我尝试在 / accounts / signup 进行注册或在进行登录/ accounts / login 我收到此错误:

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.

我认为这会引起问题:

extra_data = user.socialaccount_set.filter(provider='facebook')[0].extra_data


推荐答案

您是正确的,那是有问题的行。您可能想要更多类似的东西:

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

这篇关于IndexError,列表索引超出范围。 Django-allauth信号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆