password - Registro de Django rest-auth allauth con correo electrónico, nombre y apellido, y sin nombre de usuario
django rest token expiration (3)
Estoy usando django-rest-auth y allauth para iniciar sesión y registrarme en mi aplicación django. No he escrito ninguna línea de código adicional para iniciar sesión o registrarme. El registro es exitoso con emailid y contraseña proporcionada.
No uso el nombre de usuario para la autenticación, en lugar de correo electrónico.
En mi api navegable para el registro recibo lo siguiente:
Junto con estos campos quiero tener first_name y last_name (la tabla predeterminada auth_user tenía estas columnas) para que mi auth_user recién creado también tenga estos campos establecidos junto con la contraseña de hash y de correo electrónico.
¿Cómo puedo conseguir esto? Esta forma navegable en sí no es tan importante, pero poder almacenar first_name y last_name es lo que necesito principalmente.
Asegúrese de tener
ACCOUNT_USERNAME_REQUIRED = False
en su archivosettings.py
.Para
first_name
ylast_name
, debe escribir unRegisterSerializer
personalizado ( https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/registration/serializers.py#L119 )
aquí hay un código de muestra para 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
En
settings.py
asegúrate de agregarREST_AUTH_REGISTER_SERIALIZERS = { ''REGISTER_SERIALIZER'': ''path.to.RegisterSerializer'', }
Una solución más elegante sería heredar de RegisterSerializer y extenderse según sea necesario.
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
También puede sobrescribir el método "custom_signup" en RegisterSerializer, que está destinado a este fin.
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
Entonces puedes usar
url(r''^rest-auth/registration/name-registration/$'', NameRegistrationView.as_view(), name="rest_name_register")
en tu urls.py