【发布时间】:2021-02-06 10:23:53
【问题描述】:
Here 是将 first_name、last_name 添加到注册视图的帖子。我想在 first_name 或 last_name 旁边添加一些其他自定义用户字段。由于这些字段已经存在于用户模型中,他不必编辑用户模型。但是对于我的情况,如何编辑 dj_rest_auth 提供的用户模型并添加一些新模型?
【问题讨论】:
标签: django django-rest-framework
Here 是将 first_name、last_name 添加到注册视图的帖子。我想在 first_name 或 last_name 旁边添加一些其他自定义用户字段。由于这些字段已经存在于用户模型中,他不必编辑用户模型。但是对于我的情况,如何编辑 dj_rest_auth 提供的用户模型并添加一些新模型?
【问题讨论】:
标签: django django-rest-framework
好的,您必须创建一个自定义用户。实际上我不确定该怎么做,因为我正在使用 dj_rest_auth 包,它使用 django 的默认用户表来创建 api 响应。如果有人陷入其中,我将离开此解决方案。
创建一个应用程序。我将其命名为帐户。打开 models.py 并像这样添加自定义用户:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
department = models.CharField(max_length=5)
university = models.CharField(max_length=100)
reg_no = models.CharField(max_length=10, blank=True, null=True)
别忘了编辑这个应用的 admin.py:
from django.contrib import admin
from .models import CustomUser
admin.site.register(CustomUser)
创建一个 serializers.py 并编辑它:
from dj_rest_auth.serializers import UserDetailsSerializer
from rest_framework import serializers
from django.conf import settings
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email
from dj_rest_auth.registration.serializers import RegisterSerializer
class CustomRegisterSerializer(RegisterSerializer):
reg_no = serializers.CharField(max_length=10)
department = serializers.CharField(required=True, max_length=5)
university = serializers.CharField(required=True, max_length=100)
def get_cleaned_data(self):
data_dict = super().get_cleaned_data()
data_dict['reg_no'] = self.validated_data.get('reg_no', '')
data_dict['department'] = self.validated_data.get('department', '')
data_dict['university'] = self.validated_data.get('university', '')
return data_dict
class CustomUserDetailsSerializer(UserDetailsSerializer):
class Meta(UserDetailsSerializer.Meta):
fields = UserDetailsSerializer.Meta.fields + \
('reg_no', 'is_staff', 'department', 'university',)
您还必须添加一个 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.reg_no = data.get('reg_no')
user.department = data.get('department')
user.university = data.get('university')
user.save()
return user
最后,您必须将这些添加到项目的 settings.py 中:
将您的应用添加到已安装的应用中:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'accounts',
'rest_framework',
'rest_framework.authtoken',
'dj_rest_auth',
'allauth',
'allauth.account',
'dj_rest_auth.registration',
'allauth.socialaccount',
'allauth.socialaccount.providers.facebook',
'allauth.socialaccount.providers.twitter',
]
添加 rest auth 序列化器:
REST_AUTH_SERIALIZERS = {
'USER_DETAILS_SERIALIZER': 'accounts.serializers.CustomUserDetailsSerializer',
'PASSWORD_RESET_SERIALIZER': 'accounts.serializers.CustomPasswordResetSerializer',
}
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'accounts.serializers.CustomRegisterSerializer',
}
添加适配器和 CustomUser 模型
ACCOUNT_ADAPTER = 'accounts.adapter.CustomAccountAdapter'
AUTH_USER_MODEL = 'accounts.CustomUser'
这个问题由this解决方案解决。非常感谢 Rik Schoonbeek 的这一点。在这里,我还提供了显示 api json 数据中返回的额外字段的代码。该解决方案是为 django_rest_auth 编写的。该包从一开始就使用自定义用户模型来执行 api 调用,但 dj_rest_auth 包使用默认的 django 模型,这就是为什么我不确定该怎么做。
这里有一些图片可以看到这个作品:
【讨论】: