django 如何添加dj_rest_auth包的自定义用户字段

zmeyuzjn  于 2023-05-19  发布在  Go
关注(0)|答案(3)|浏览(194)

Here是将first_name,last_name添加到注册视图的帖子。我想在first_name或last_name旁边添加一些其他自定义用户字段。由于这些字段已经存在于用户模型中,因此他不必编辑用户模型。但是对于我的例子来说,如何编辑dj_rest_auth提供的用户模型并添加一些新模型呢?

sg24os4d

sg24os4d1#

好的,你必须创建一个自定义用户。实际上,我不确定该怎么做,因为我正在使用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这个应用程序的www.example.com:

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的项目的www.example.com:
将您的应用添加到已安装的应用:

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数据中返回的额外字段的代码。这个解决方案是为django_rest_auth编写的。那个包从一开始就使用自定义用户模型来进行API调用,但是dj_rest_auth包使用默认的django模型,这就是为什么我不确定该怎么做。
下面是一些图片来看看这个作品:

2uluyalo

2uluyalo2#

我有一个更好的方法,更简单,更灵活。您可以使用django-allauth提供的**custom_signup()**函数专门针对这种情况。

class CreateUser_Serializer(RegisterSerializer, serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("username", "first_name", "last_name", 'email', 'nationality', 'bio', 'phone', 'phone2', 'gender',
                  'birthday', 'pin_code', 'password1', 'password2')

    def custom_signup(self, request: Request, user: User) -> None:
        for f in self.Meta.fields:
            if hasattr(user, f) and not getattr(user, f):
                setattr(user, f, self.initial_data[f])

        user.save()

输出:
enter image description here

plicqrtu

plicqrtu3#

需要注意的是,您还需要创建CustomRegisterView(或另一个视图)并更改urlpatterns,如此答案Dj Rest Auth custom registration not working中所述。在那之后,一切都为我工作。

相关问题