[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 分页)