Я сам искал ответ.Потратьте некоторое время на копание в исходном коде.Я понимаю, что в этом решении может отсутствовать фактическая проверка дополнительных полей, добавленных в пользовательскую модель пользователя, но я рассмотрю это позже.
То, что я написал ниже, я написал с учетом потенциальной записи в блоге.
Я предполагаю, что вы знаете, как настроить проект DRF и установить вышеупомянутые пакеты.В документации django-rest-auth ясно, как установить этот пакет (https://django -rest-auth.readthedocs.io / en / latest / index.html ), также обязательно следуйте инструкциямустановить часть django-rest-auth для регистрации пользователей.
Создать новое приложение 'users'
Это приложение будет содержать мой пользовательский код для реализации пользовательскихпользовательская модель.Я также устанавливаю его в основной файл настроек Django:
settings.py:
INSTALLED_APPS = [
...
'users',
]
Создайте свою пользовательскую модель
Обратите внимание, что ятолько что добавили одно настраиваемое поле, но вы можете добавить любые поля, которые вам нужны.
users.models.py:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
preferred_locale = models.CharField(max_length=2, blank=True, null=True)
Скажите django использовать модель CustomUser
settings.py:
…
AUTH_USER_MODEL = 'users.CustomUser'
Регистрация пользовательской модели пользователя в Django admin
users.admin.py:
from django.contrib import admin
from .models import CustomUser
admin.site.register(CustomUser)
Выполните миграции и запустите их
Впервые я делаю это для этого проекта.
В командной строке:
python manage.py makemigrations users
python manage.py migrate
Регистрация новых пользователей с дополнительными полями
Если вы запустите сервер разработки Django сейчас, вы увидите в администраторе, что вы можете видеть пользовательскую модель пользователя с дополнительными полями.
Но когда вы переходите к 'http://127.0.0.1:8000/rest-auth/registration/’, вы еще не видите дополнительных полей.
В процессе регистрации пользователя используются два важных класса,а именно:
- сериализатор 'rest_auth.registration.RegisterSerializer'
- адаптер 'allauth.account.adapter.DefaultAccountAdapter'
Мы сделаемпользовательская версия обоих, наследующая все функциональные возможности родительского класса.
Создание пользовательского RegisterSerializer
Создайте новый файл 'serializers.py' вusers app / folder.
users.serializers.py:
from rest_framework import serializers
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email
from rest_auth.registration.serializers import RegisterSerializer
class CustomRegisterSerializer(RegisterSerializer):
preferred_locale = serializers.CharField(
required=False,
max_length=2,
)
def get_cleaned_data(self):
data_dict = super().get_cleaned_data()
data_dict['preferred_locale'] = self.validated_data.get('preferred_locale', '')
return data_dict
Здесь я создаю новое поле для каждого дополнительного поля в пользовательской модели пользователя.Так что в моем случае добавлено следующее:
preferred_locale = serializers.CharField(
required=False,
max_length=2,
)
Кроме того, метод get_cleaned_data должен возвращать dict, который содержит все данные для полей, которые вы хотите сохранить при регистрации нового пользователя.
Вот как выглядит оригинальный метод (по умолчанию RegisterSerializer):
def get_cleaned_data(self):
return {
'username': self.validated_data.get('username', ''),
'password1': self.validated_data.get('password1', ''),
'email': self.validated_data.get('email', '')
}
Как видно, он возвращает словарь, содержащий все данные для нового пользователя.Вы хотите добавить ключевую запись в этот словарь для каждого дополнительного поля, которое вы добавили в свою пользовательскую модель.
В моем случае, требуется только добавить данные для поля 'selected_locale', это результирующий метод:
def get_cleaned_data(self):
data_dict = super().get_cleaned_data()
data_dict['preferred_locale'] = self.validated_data.get('preferred_locale', '')
return data_dict
Скажите django использовать этот новый сериализатор
settings.py:
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'users.serializers.CustomRegisterSerializer',
}
Предотвращение ошибок
Если вы попытаетесь зарегистрировать нового пользователя, вы можете получить следующую ошибку в консоли, на которой работает сервер разработки: ConnectionRefusedError: [Errno 111] Соединение отклонено
Хотя пользовательЭта ошибка по-прежнему может быть исправлена путем добавления в файл settings.py следующей строки:
settings.py:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
Другая ошибка, которая возникает при удалении пользователя,:
django.db.utils.OperationalError: no such table: allauth_socialaccount
Чтобы решить эту проблему, добавьте это в ваши settings.py:
settings.py:
INSTALLED_APPS = [
...
'allauth.socialaccount',
]
После этого вы должны применить миграции до того, какможно продолжить:
python manage.py migrate
Созданиепользовательский AccountAdapter
После выполнения описанных выше действий, go '1126 *http://127.0.0.1:8000/rest-auth/registration/’ покажет вам дополнительные поля.Но когда вы регистрируете нового пользователя и отправляете данные для дополнительных полей, данные дополнительного поля не сохраняются.
Последнее, что нам нужно сделать, чтобы решить эту проблему, - это создать собственный AccountAdapter
В нашем пользовательском приложении / папке создайте новый файл с именем 'adapter.py':
users.adapter.py:
from allauth.account.adapter import DefaultAccountAdapter
class CustomAccountAdapter(DefaultAccountAdapter):
def save_user(self, request, user, form, commit=False):
user = super().save_user(request, user, form, commit)
data = form.cleaned_data
user.preferred_locale = data.get('preferred_locale')
user.save()
return user
Здесь, если вы выполнили вышеуказанные шагиправильно, вы можете получить доступ к данным дополнительных добавленных полей в словаре form.cleaned_data.Это словарь, который возвращается методом get_cleaned_data из нашего пользовательского RegisterSerializer.
В приведенном выше методе save_user мы можем затем использовать эти данные и сохранить их в соответствующих полях, например:
user.preferred_locale = data.get('preferred_locale')
Скажите Django использовать эти новые адаптеры
settings.py:
ACCOUNT_ADAPTER = 'users.adapter.CustomAccountAdapter'
Теперь вы можете зарегистрировать своего пользователя, используя конечную точку регистрации django-rest-auth '/ rest-auth / registration / 'и отправьте данные для дополнительных полей, которые вы добавили.Все это будет сохранено в одном запросе.
Опять же, я понимаю, что необходимо добавить пользовательскую проверку для каждого поля.Но это еще одна тема, в которую я углублюсь позже и обновлю пост, когда узнаю, как это работает точно.