2013-04-13 42 views
0

我正在使用自定義用戶模型來保持用戶的詳細信息與django 1.5,下面是我的代碼。使用社交身份驗證時,一切似乎都正常工作,請接受first_name和last_name。django社交認證創建配置文件時不返回first_name和last_name - django 1.5

在我的表格結構中,我沒有first_name和last_name,而是我有一個字段全名。

但是,我確實在管理器中創建了一個方法來接受名字和姓氏並將它們組合起來。但是,仍然收到空值,有任何建議,爲什麼發生這種情況?創建用戶時,而不是你的經理打電話create_user

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的社會權威性不喜歡的工作,它只是將用戶名和電子郵件,你可以看到here。後來在管道中的用戶模型更字段更新時,這是called,但作爲代碼說,它確實getattr(user, name, None)它在你情況下first_namelast_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]) 
相關問題