Djangoアプリで、ログインと登録にDjango-rest-authとallauthを使用しています。ログインまたは登録用のコードを1行も追加していません。登録は成功していますemailidと提供されたパスワード。
認証にユーザー名を使用していません。代わりにメールを使用しています。
登録用の参照可能なapiで、次のようになります。
これらのフィールドに加えて、first_nameとlast_name(デフォルトのauth_userテーブルにはこれらの列がありました)を設定したいので、新しく作成したauth_userにもこれらのフィールドが電子メールとハッシュパスワードとともに設定されています。
どうすればこれを達成できますか?この参照可能なフォーム自体はそれほど重要ではありませんが、first_nameとlast_nameを格納できることが私が主に必要とするものです。
ACCOUNT_USERNAME_REQUIRED = False
ファイルにsettings.py
があることを確認してください。
first_name
およびlast_name
の場合、カスタムRegisterSerializer
を作成する必要があります( https://github.com/Tivix/Django-rest-auth/blob/master/rest_auth /registration/serializers.py#L166 )
これが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
settings.py
では、新しいシリアライザを参照するように追加してください。
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'path.to.RegisterSerializer',
}
また、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
次に、urls.py
で以下を使用します
url(r'^rest-auth/registration/name-registration/$', NameRegistrationView.as_view(), name="rest_name_register")
またはREGISTER_SERIALIZER
にsettings.py
を設定します
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'path.to.RegisterSerializer',
}
よりエレガントなソリューションは、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