with password instalar framework expiration example django django-rest-framework django-allauth django-rest-auth

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.


  1. Asegúrese de tener ACCOUNT_USERNAME_REQUIRED = False en su archivo settings.py .

  2. Para first_name y last_name , debe escribir un RegisterSerializer 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

  1. En settings.py asegúrate de agregar

    REST_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