【问题标题】:How to add custom user fields of dj_rest_auth package如何添加 dj_rest_auth 包的自定义用户字段
【发布时间】:2021-02-06 10:23:53
【问题描述】:

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    好的,您必须创建一个自定义用户。实际上我不确定该怎么做,因为我正在使用 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 模型,这就是为什么我不确定该怎么做。

    这里有一些图片可以看到这个作品:

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多