I am using django-rest-auth and allauth for login and registration in my django app. I haven't written any extra single line of code of my own for login or registration. Registration is successful with emailid and provided password.
我在django应用中使用django-res -auth和allauth进行登录和注册。我还没有为登录或注册额外编写任何一行代码。注册成功的emailid和提供的密码。
I am not using username for authentication, instead email.
我不使用用户名进行身份验证,而是使用电子邮件。
In my browsable api for registration I get following:
在我的可浏览的注册api中,我得到以下信息:
Along with these fields I want to have first_name and last_name (the default auth_user table had these columns) so that my newly created auth_user also has these fields set along with email and hashed password.
除了这些字段之外,我还希望使用first_name和last_name(默认的auth_user表中有这些列),以便我新创建的auth_user也将这些字段与电子邮件和散列密码一起设置。
How can I achieve this? This browsable form itself is not so important but being able to store first_name and last_name is what I need primarily.
我如何做到这一点?这个可浏览的表单本身并不重要,但是能够存储first_name和last_name是我主要需要的。
3 个解决方案
#1
13
-
Make sure you have
ACCOUNT_USERNAME_REQUIRED = False
in yoursettings.py
file.确保在设置中有ACCOUNT_USERNAME_REQUIRED = False。py文件。
-
For
first_name
andlast_name
you need to write a customRegisterSerializer
(https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/registration/serializers.py#L119)对于first_name和last_name,您需要编写一个定制的RegisterSerializer (https://github.com/tivix/django -res - auth/blob/master/rest_auth/registration/serializers.p119)
here's a sample code for serializers.py
这里是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
-
In
settings.py
make sure you add在设置。一定要加
REST_AUTH_REGISTER_SERIALIZERS = { 'REGISTER_SERIALIZER': 'path.to.RegisterSerializer', }
#2
4
A more elegant solution would be to inherit from RegisterSerializer and extend as needed.
更优雅的解决方案是继承RegisterSerializer并根据需要进行扩展。
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
#3
4
You can also just overwrite the custom_signup
method on RegisterSerializer
, which is intended for this purpose.
您还可以在RegisterSerializer上覆盖custom_signup方法,这是为这个目的而设计的。
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
Then use the following in your urls.py
然后在你的urls.py中使用以下代码
url(r'^rest-auth/registration/name-registration/$', NameRegistrationView.as_view(), name="rest_name_register")
or set REGISTER_SERIALIZER
in settings.py
或在settings.py中设置REGISTER_SERIALIZER。
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'path.to.RegisterSerializer',
}
#1
13
-
Make sure you have
ACCOUNT_USERNAME_REQUIRED = False
in yoursettings.py
file.确保在设置中有ACCOUNT_USERNAME_REQUIRED = False。py文件。
-
For
first_name
andlast_name
you need to write a customRegisterSerializer
(https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/registration/serializers.py#L119)对于first_name和last_name,您需要编写一个定制的RegisterSerializer (https://github.com/tivix/django -res - auth/blob/master/rest_auth/registration/serializers.p119)
here's a sample code for serializers.py
这里是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
-
In
settings.py
make sure you add在设置。一定要加
REST_AUTH_REGISTER_SERIALIZERS = { 'REGISTER_SERIALIZER': 'path.to.RegisterSerializer', }
#2
4
A more elegant solution would be to inherit from RegisterSerializer and extend as needed.
更优雅的解决方案是继承RegisterSerializer并根据需要进行扩展。
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
#3
4
You can also just overwrite the custom_signup
method on RegisterSerializer
, which is intended for this purpose.
您还可以在RegisterSerializer上覆盖custom_signup方法,这是为这个目的而设计的。
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
Then use the following in your urls.py
然后在你的urls.py中使用以下代码
url(r'^rest-auth/registration/name-registration/$', NameRegistrationView.as_view(), name="rest_name_register")
or set REGISTER_SERIALIZER
in settings.py
或在settings.py中设置REGISTER_SERIALIZER。
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'path.to.RegisterSerializer',
}