2013-04-13 2 views
0

Я использую пользовательскую модель для поддержки сведений о пользователе с помощью django 1.5, ниже мой код. При использовании социальной аутентификации все, кажется, работает нормально, принимают first_name и last_name.django social auth не возвращает first_name и last_name при создании профиля - django 1.5

В моей структуре таблицы таблицы у меня нет first_name и last_name, вместо этого у меня есть одно полное имя поля.

но, я создал метод в менеджере, чтобы принять имя и фамилию и объединить их. но, все еще получая пустые ценности, какие-либо советы о том, почему это происходит?

class UserManager(BaseUserManager): 
    """ 
    UserManager() 
    """ 
    def create_user(self, username, email=None, password=None, first_name='', last_name='', **extra_fields): 
     if not username: 
      raise ValueError('Users must have a username') 

     user = self.model(
      username=username, 
      email=UserManager.normalize_email(email), 
      full_name='%s %s' % (first_name, last_name), 
     ) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 


class User(AbstractBaseUser, PermissionsMixin): 
    """ 
    Accounts/User 
    """ 

    GENDERS = (
     (u'M', _('Male')), 
     (u'F', _('Female')), 
    ) 


    username = models.CharField(_('username'), max_length=30, unique=True, 
     help_text=_('Required. 30 characters or fewer. Letters, numbers and ' 
        '@/./+/-/_ characters'), 
     validators=[ 
      validators.RegexValidator(re.compile('^[\[email protected]+-]+$'), _('Enter a valid username.'), 'invalid') 
     ]) 


    email   = models.EmailField(_('email address'), blank=True) 


    is_staff = models.BooleanField(_('staff status'), default=False, 
     help_text=_('Designates whether the user can log into this admin ' 
        'site.')) 
    is_active = models.BooleanField(_('active'), default=True, 
     help_text=_('Designates whether this user should be treated as ' 
        'active. Unselect this instead of deleting accounts.')) 
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 

    # user details and information 
    full_name   = models.CharField(_('full name'), max_length=30,) 
    date_of_birth  = models.DateField(_('birthday'), null=True, blank=True) 
    bio     = models.TextField(_('biography/about you'), null=True, blank=True, help_text=_('Biography/About you')) 
    gender    = models.CharField(_('gender'), max_length=1, blank=True, null=True, choices=GENDERS) 

    # follows/followers 
    followings   = models.ManyToManyField('self', through='Relationship', symmetrical=False, related_name='followers') 

    objects    = UserManager() 

    USERNAME_FIELD = 'username' 
    REQUIRED_FIELDS = ['email', 'date_of_birth', 'full_name',] 

ответ

1

Django-социально-аутентификации не работает, как, что при создании пользователя, вместо того, чтобы при вызове create_user в менеджере, он просто передает имя пользователя и электронную почту, как вы можете видеть here. Позже в конвейере больше полей в вашей модели пользователя обновляется, когда это called, но, как говорится в коде, он делает getattr(user, name, None), который в вашем случае для first_name и last_name возвращает None, так как эти поля в вашей модели не определены.

Вы можете обмануть систему, определяя некоторые свойства в модели, что-то вроде этого:

class User(...): 
    @property 
    def first_name(self): 
     if not hasattr(self, '_first_name'): 
      self._first_name = self.full_name.split(' ', 1)[0] 
     return self._first_name 

    @first_name.setter 
    def first_name(self, value): 
     self._first_name = value 
     self.build_full_name() 

    @property 
    def last_name(self): 
     if not hasattr(self, '_last_name'): 
      self._last_name = self.full_name.split(' ', 1)[-1] 
     return self._last_name 

    @first_name.setter 
    def last_name(self, value): 
     self._last_name = value 
     self.build_full_name() 

    def build_full_name(self): 
     self.full_name = ' '.join([self._first_name, self._last_name]) 
Смежные вопросы