You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中将新注册用户存入User模型(认证授权模块)?

我来帮你解决这个问题——核心原因是你现在的代码只把数据存到了自定义的Register模型里,完全没有和Django内置的auth.User模型产生交互,所以admin里的用户列表自然看不到新注册的用户。

第一步:修改序列化器,创建User实例并关联Register

你的RegisterSerializer现在只是保存Register对象,但没有创建对应的User。我们需要重写序列化器的create方法,先创建内置User,再关联到自定义的Register模型。

修改serializers.py:

from rest_framework import serializers
from .models import Register
from django.contrib.auth.models import User

class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Register
        fields = ['username', 'email', 'password']

    def create(self, validated_data):
        # 1. 用Django内置的create_user方法创建User(自动哈希密码,避免明文存储)
        user = User.objects.create_user(
            username=validated_data['username'],
            email=validated_data['email'],
            password=validated_data['password']
        )
        # 2. 创建Register对象并关联刚刚创建的User
        register = Register.objects.create(
            user=user,
            username=validated_data['username'],
            email=validated_data['email'],
            password=validated_data['password']  # 注意:这里存明文密码不安全,后面会说优化方案
        )
        return register

第二步:优化你的Register模型(重要!)

你现在的Register模型里的username、email、password和内置User的字段完全重复,而且直接存明文密码有极大的安全风险。建议删掉这些重复字段,只保留和User的一对一关联,以及你真正需要的额外用户信息(比如手机号、地址等):

修改models.py:

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

class Register(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # 这里只添加User模型没有的字段,比如:
    # phone = models.CharField(max_length=11, blank=True)
    # address = models.TextField(blank=True)

    def __str__(self):
        return self.user.username  # 之前的self.name会报错,因为模型里没有name字段,改用关联User的username

对应的,序列化器也要调整,因为Register模型不再有username等字段,我们需要显式定义这些字段来接收前端数据:

from rest_framework import serializers
from .models import Register
from django.contrib.auth.models import User

class RegisterSerializer(serializers.ModelSerializer):
    # 显式定义需要接收的字段(因为模型里没有这些)
    username = serializers.CharField(max_length=100)
    email = serializers.EmailField(max_length=100)
    password = serializers.CharField(max_length=100, write_only=True)  # write_only避免返回密码

    class Meta:
        model = Register
        fields = ['username', 'email', 'password']

    def create(self, validated_data):
        # 提取User所需数据,创建User实例
        user = User.objects.create_user(
            username=validated_data['username'],
            email=validated_data['email'],
            password=validated_data['password']
        )
        # 创建Register并关联User
        register = Register.objects.create(user=user)
        return register

更简单的替代方案:直接序列化内置User模型

如果你不需要存储额外的用户信息,完全可以不用自定义Register模型,直接基于auth.User写序列化器,这样代码更简洁:

serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User

class UserRegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'email', 'password']
        extra_kwargs = {'password': {'write_only': True}}  # 密码只写不读

    def create(self, validated_data):
        # 用create_user自动处理密码哈希
        return User.objects.create_user(**validated_data)

views.py

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import UserRegisterSerializer

class RegisterView(APIView):
    def post(self, request, format=None):
        serializer = UserRegisterSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response("Thank you for registering", status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

验证效果

完成以上修改后,用Postman重新发送注册请求,你会发现新用户已经出现在admin的「Users(Authentication and Authorization)」列表里了——因为我们现在真正创建了auth.User实例。

内容的提问来源于stack exchange,提问作者jelly_bean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:28:49