2014-10-09 5 views
2

Как я могу предварительно заполнить форму регистрации с дополнительными данными в django-allauth после того, как я был связан с Facebook во время регистрации?Prepopulate пользовательские формы с социальными данными в django-allauth

В моих настройках я следующее

settings.py

SOCIALACCOUNT_AUTO_SIGNUP = False 

Скажем, у меня есть UserProfile модель с некоторыми данными, относящимися к пользователю.

models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    gender = models.CharField(max_length=1) 

Если я использую следующую форму, незарегистрированного пользователь может соединиться с Facebook и получает регистрационную форму для заполнения (экземпляр UserSignupForm), где первое имя и фамилию уже предварительно заполнены. Как я могу автоматически заполнить пол, используя данные, собранные из Facebook? Другими словами, я хотел бы использовать пол, взятый из дополнительных данных facebook, в качестве исходных данных для формы регистрации.

settings.py

ACCOUNT_SIGNUP_FORM_CLASS = 'UserSignupForm' 

forms.py

class UserSignupForm(forms.ModelForm): 
    first_name = forms.CharField(label=_('First name'), max_length=30) 
    last_name = forms.CharField(label=_('Last name'), max_length=30) 

    class Meta: 
     model = UserProfile 
     fields = ['first_name', 'last_name', 'gender'] 

    def signup(self, request, user): 
     user.first_name = self.cleaned_data['first_name'] 
     user.last_name = self.cleaned_data['last_name'] 

     self.instance.user = user 

     self.instance.user.save() 
     self.instance.save() 

Мне кажется, что я должен изменить адаптер.

adapter.py

class UserProfileSocialAccountAdapter(DefaultSocialAccountAdapter): 
    def populate_user(self, request, sociallogin, data): 
     user = super(UserProfileSocialAccountAdapter, self).populate_user(request, sociallogin, data) 

     # Take gender from social data 
     # The following line is wrong for many reasons 
     # (user is not saved in the database, userprofile does not exist) 
     # but should give the idea 
     # user.userprofile.gender = 'M' 

     return user 

ответ

0

Я использую решение, которое не использует адаптер, но приоритет инициализации формы регистрации.

forms.py

class UserSignupForm(forms.ModelForm): 
    first_name = forms.CharField(label=_('First name'), max_length=30) 
    last_name = forms.CharField(label=_('Last name'), max_length=30) 

    class Meta: 
     model = UserProfile 
     fields = ['first_name', 'last_name', 'gender'] 

    def __init__(self, *args, **kwargs): 
     super(UserSignupForm, self).__init__(*args, **kwargs) 
     if hasattr(self, 'sociallogin'): 
      if 'gender' in self.sociallogin.account.extra_data: 
       if self.sociallogin.account.extra_data['gender'] == 'male': 
        self.initial['gender'] = 'M' 
       elif self.sociallogin.account.extra_data['gender'] == 'female': 
        self.initial['gender'] = 'F' 
Смежные вопросы