[Django Rest Framework]:如何在注册页面上添加 phone_number 字段?

Posted

技术标签:

【中文标题】[Django Rest Framework]:如何在注册页面上添加 phone_number 字段?【英文标题】:[Django Rest Framework]: How to additional phone_number field on Registration page? 【发布时间】:2021-07-26 00:26:46 【问题描述】:

我成功创建了可以在用户登录和注册时生成令牌的 api,还有一个 api 页面,我可以在其中显示所有注册用户(需要管理员权限)。但我无法在我的注册页面上添加额外的字段,例如电话号码。

我还需要注册页面上的电话号码字段。目前它有名字、姓氏、电子邮件和密码。

模型.py

from django.db import models
from django.contrib.auth.models import User
from phonenumber_field.modelfields import PhoneNumberField


class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_profile')
    phone_number = PhoneNumberField(blank=True, null=True)

    def __str__(self):
        return str(self.user)

序列化器.py

from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework_simplejwt.tokens import RefreshToken
from .models import Profile


class ProfileSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Profile
        fields = '__all__'


class UserSerializer(serializers.ModelSerializer):
    firstName = serializers.SerializerMethodField(read_only=True) 
    lastName = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'firstName', 'lastName']

    def get_firstName(self, obj):
        firstName = obj.first_name
        return firstName

    def get_lastName(self, obj):
        lastName = obj.last_name
        return lastName


class UserSerializerWithToken(UserSerializer):
    token = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'firstName', 'lastName', 'token']

    def get_token(self, obj):
        token = RefreshToken.for_user(obj)
        return str(token.access_token)

Views.py

from django.shortcuts import render
from django.contrib.auth.models import User
from .models import Profile
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from .serializers import ProfileSerializer, UserSerializer, UserSerializerWithToken
from rest_framework.response import Response
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from django.contrib.auth.hashers import make_password
from rest_framework import status


class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super().validate(attrs)

        serializer = UserSerializerWithToken(self.user).data
        for k, v in serializer.items():
            data[k] = v

        return data


class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer


@api_view(['POST'])
def registerUser(request):
    data = request.data

    try:
        user = User.objects.create(
            first_name=data['firstName'],
            last_name=data['lastName'],
            username=data['email'],
            email=data['email'],
            password=make_password(data['password']))


        serializer = UserSerializerWithToken(user, many=False)
        return Response(serializer.data)
    except:
        message = 'detail': 'User with this email already exists'
        return Response(message, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getUserProfile(request):
    user = request.user
    serializer = UserSerializer(user, many=False)
    return Response(serializer.data)


@api_view(['GET'])
@permission_classes([IsAdminUser])
def getUsers(request):
    users = User.objects.all()
    serializer = UserSerializer(users, many=True)
    return Response(serializer.data)

【问题讨论】:

【参考方案1】:

您需要定义一个自定义 User 模型并添加 phone_number 字段,或者简单地将其添加到 Profile 模型中。 Django 文档建议您定义自定义用户模型。

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    phone_number = models.CharField(max_length=20)

【讨论】:

谢谢,我会试一试,如果有效,我会告诉你。

以上是关于[Django Rest Framework]:如何在注册页面上添加 phone_number 字段?的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework api如何为所有人添加身份验证权限

如何处理 django-rest-framework 中 url 模式中的外键关系

Django REST Framework:如何用空字符串替换 null?

Django Rest Framework:在 ViewSet 上打开分页(如 ModelViewSet 分页)

Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?

使用 django-rest-framework-simplejwt 注册后返回令牌