9

django-rest-auth ve allauth kullanıyorum giriş ve kayıt benim django app. Giriş veya kayıt için herhangi bir ekstra tek satırlık kod yazmamıştım. Kayıt, emailid ve şifre ile başarılıdır.Django rest-auth allauth e-posta adresleri, isim ve soyis ile, ve kullanıcı adı olmadan

Kimlik doğrulama için kullanıcı adı kullanmıyorum, bunun yerine e-posta. Kayıt için benim göz atılabilir API olarak

aşağıdaki olsun: Ben ve FIRST_NAME last_name istiyorum bu alanlarda birlikte

enter image description here

(varsayılan auth_user tablo bu sütunlar vardı) Ayrıca benim yeni oluşturulan auth_user böylece e-posta ve karma şifre ile birlikte bu alanlara sahiptir.

Bunu nasıl başarabilirim? Bu taranabilir formun kendisi çok önemli değil, ancak first_name ve last_name'i saklayabilmek, öncelikle ihtiyacım olan şey.

cevap

12
  1. Eğer settings.py dosyasında ACCOUNT_USERNAME_REQUIRED = False olduğundan emin olun. Eğer özel bir RegisterSerializer (https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/registration/serializers.py#L119) burada

yazmaya gerek

  • first_name için

    ve last_name yılında serializers.py

    from allauth.account import app_settings as allauth_settings 
    from allauth.utils import email_address_exists 
    from allauth.account.adapter import get_adapter 
    from allauth.account.utils import setup_user_email 
    
    class RegisterSerializer(serializers.Serializer): 
        email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED) 
        first_name = serializers.CharField(required=True, write_only=True) 
        last_name = serializers.CharField(required=True, write_only=True) 
        password1 = serializers.CharField(required=True, write_only=True) 
        password2 = serializers.CharField(required=True, write_only=True) 
    
        def validate_email(self, email): 
         email = get_adapter().clean_email(email) 
         if allauth_settings.UNIQUE_EMAIL: 
          if email and email_address_exists(email): 
           raise serializers.ValidationError(
            _("A user is already registered with this e-mail address.")) 
         return email 
    
        def validate_password1(self, password): 
         return get_adapter().clean_password(password) 
    
        def validate(self, data): 
         if data['password1'] != data['password2']: 
          raise serializers.ValidationError(
           _("The two password fields didn't match.")) 
         return data 
    
        def get_cleaned_data(self): 
         return { 
          'first_name': self.validated_data.get('first_name', ''), 
          'last_name': self.validated_data.get('last_name', ''), 
          'password1': self.validated_data.get('password1', ''), 
          'email': self.validated_data.get('email', ''), 
         } 
    
        def save(self, request): 
         adapter = get_adapter() 
         user = adapter.new_user(request) 
         self.cleaned_data = self.get_cleaned_data() 
         adapter.save_user(request, user, self) 
         setup_user_email(request, user, []) 
         user.profile.save() 
         return user 
    
    1. için örnek bir kod settings.py

      eklediğinizden emin olun
  • +0

    yılında REGISTER_SERIALIZER set tüm mı senin şu satırlar? Görünümlerde değişiklik yok mu? – Nitish

    +0

    Bu mükemmel çalışır, kullanıcı adı ve soyadı ile kaydedilir! Ancak 'User' nesnesi user.profile.save() bu satırda 'profile' özniteliği olmadığını söylerken bir hata alıyorum .. – Nitish

    +1

    Çözüldü! User.profile.save() 'yi user.save() olarak değiştirdim. Çok teşekkürler! – Nitish

    3

    Daha zarif bir çözüm, RegisterSerializer'dan miras almak ve gerektiğinde genişletmek olacaktır.

    class MyRegisterSerializer(RegisterSerializer): 
        first_name = serializers.CharField(required=True, write_only=True) 
        last_name = serializers.CharField(required=True, write_only=True) 
    
        def get_cleaned_data(self): 
         return { 
          'first_name': self.validated_data.get('first_name', ''), 
          'last_name': self.validated_data.get('last_name', ''), 
          'password1': self.validated_data.get('password1', ''), 
          'email': self.validated_data.get('email', ''), 
         } 
    
        def save(self, request): 
         adapter = get_adapter() 
         user = adapter.new_user(request) 
         self.cleaned_data = self.get_cleaned_data() 
         adapter.save_user(request, user, self) 
         setup_user_email(request, user, []) 
         user.save() 
         return user 
    
    +0

    Minimum miktarda özel kod içeren bir çekicilik gibi çalışır. Bence bu daha zarif bir çözüm. Mesaj için teşekkürler. – guyja

    +0

    Harika çalışıyor ama bence kayıt fonksiyonu gerekli değil, değil mi? – Rani

    2

    Ayrıca sadece bu amaç için tasarlanmıştır RegisterSerializer üzerine custom_signup yöntemi, üzerine yazabilirsiniz.

    from rest_auth.registration.serializers import RegisterSerializer 
    from rest_auth.registration.views import RegisterView 
    from rest_framework import serializers 
    
    
    class NameRegistrationSerializer(RegisterSerializer): 
    
        first_name = serializers.CharField(required=False) 
        last_name = serializers.CharField(required=False) 
    
        def custom_signup(self, request, user): 
        user.first_name = self.validated_data.get('first_name', '') 
        user.last_name = self.validated_data.get('last_name', '') 
        user.save(update_fields=['first_name', 'last_name']) 
    
    
    class NameRegistrationView(RegisterView): 
        serializer_class = NameRegistrationSerializer 
    

    Sonra urls.py

    url(r'^rest-auth/registration/name-registration/$', NameRegistrationView.as_view(), name="rest_name_register") 
    

    veya settings.py

    REST_AUTH_REGISTER_SERIALIZERS = { 
        'REGISTER_SERIALIZER': 'path.to.RegisterSerializer', 
    } 
    
    İlgili konular