Я думаю, что вы все делаете правильно, в вашем обычае TokenSerializer
вам нужно каким-то образом получить пользователя. Если я посмотрю на код LoginView
, я вижу, что вы можете использовать request
объект из context
в сериализаторе, поэтому ваш TokenSerializer
должен выглядеть следующим образом:
# serializers.py
class TokenSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
class Meta:
model = TokenModel
fields = ('key', 'user')
def get_user(self, instance):
request = self.context.get('request')
return UserSerializer(request.user).data
, а затем settings.py
REST_AUTH_SERIALIZERS = {
'TOKEN_SERIALIZER': 'project.serializers.TokenSerializer',
}
РЕДАКТИРОВАНИЕ: Это может нарушить представление вашего реестра, потому что если вы посмотрите на исходный код , в строке 60 он использует то же самое Сериализатор, но не передает объект запроса в контексте сериализатора. Вы можете заставить его работать, переопределив этот метод
# views.py
from django.conf import settings
from rest_auth.registeraion.views import RegisterView
from allauth.account import app_settings as allauth_settings
from rest_auth.app_settings import (TokenSerializer,
JWTSerializer)
class CustomRegisterView(RegisterView):
def get_response_data(self, user):
if allauth_settings.EMAIL_VERIFICATION == \
allauth_settings.EmailVerificationMethod.MANDATORY:
return {"detail": _("Verification e-mail sent.")}
if getattr(settings, 'REST_USE_JWT', False):
data = {
'user': user,
'token': self.token
}
return JWTSerializer(data).data
else:
return TokenSerializer(user.auth_token, context={"request": self.request}).data
, а затем использовать это представление для регистрации в ваших URL
# urls.py
from views import CustomRegisterView
urlpatterns = [
...,
url(r'^rest-auth/', include('rest_auth.urls')),
url(r'^rest-auth/registration/', CustomRegisterView.as_view())
]