9

Tôi đang sử dụng django-rest-auth và allauth để đăng nhập và đăng ký trong ứng dụng django của tôi. Tôi đã không viết thêm bất kỳ dòng mã nào của riêng tôi để đăng nhập hoặc đăng ký. Đăng ký thành công với emailid và mật khẩu được cung cấp.Đăng ký allauth Django còn lại với email, họ và tên, và không có tên người dùng

Tôi không sử dụng tên người dùng để xác thực, thay vào đó là email.

Trong api có thể xem tôi đăng ký tôi nhận được như sau:

enter image description here

Cùng với các lĩnh vực này tôi muốn có first_name và last_name (bảng auth_user mặc định có các cột) để auth_user mới tạo cũng có các trường này được đặt cùng với email và mật khẩu băm.

Tôi làm cách nào để đạt được điều này? Hình thức duyệt này chính nó không phải là rất quan trọng nhưng có thể lưu trữ first_name và last_name là những gì tôi cần chủ yếu.

Trả lời

12
  1. Đảm bảo bạn có ACCOUNT_USERNAME_REQUIRED = False trong tệp settings.py của mình.

  2. Đối first_namelast_name bạn cần phải viết một tùy chỉnh RegisterSerializer (https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/registration/serializers.py#L119)

đây là một mẫu mã cho 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. Trong settings.py đảm bảo bạn thêm

    REST_AUTH_REGISTER_SERIALIZERS = { 
         'REGISTER_SERIALIZER': 'path.to.RegisterSerializer', 
    } 
    
+0

Có phải đó là tất cả? Không có thay đổi về lượt xem? – Nitish

+0

hoạt động hoàn hảo, người dùng được lưu với họ và tên! Tuy nhiên tôi nhận được một lỗi nói rằng 'Người dùng' đối tượng không có thuộc tính 'hồ sơ' tại user.profile.save() dòng này .. – Nitish

+1

Giải quyết! Tôi đã thay đổi user.profile.save() thành user.save() Cảm ơn rất nhiều! – Nitish

3

Một giải pháp thanh lịch hơn sẽ được kế thừa từ RegisterSerializer và mở rộng khi cần.

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

Hoạt động như một sự quyến rũ với số lượng mã tùy chỉnh tối thiểu. Tôi nghĩ đây là giải pháp thanh lịch hơn. Cảm ơn vì đăng. – guyja

+0

Hoạt động tốt, nhưng tôi nghĩ chức năng lưu là không cần thiết, phải không? – Rani

2

Bạn cũng có thể chỉ ghi đè lên các phương pháp custom_signup trên RegisterSerializer, đó là dành cho mục đích này.

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 

Sau đó sử dụng sau bạn urls.py

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

hoặc thiết lập REGISTER_SERIALIZER trong settings.py

REST_AUTH_REGISTER_SERIALIZERS = { 
    'REGISTER_SERIALIZER': 'path.to.RegisterSerializer', 
} 
Các vấn đề liên quan