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

Django REST Framework注册时出现意外password2字段报错如何修复

问题原因

报错的核心是你自定义的save()方法缩进错误,被定义在了序列化器的Meta类内部,没有生效。
DRF 原生的ModelSerializer.save()逻辑会尝试把fields中声明的所有字段值都传递给模型实例化步骤,而你的Client模型没有password2字段,默认逻辑把password2参数传递给Client()构造方法时就触发了该报错。

修复方案

只需要调整save()方法的缩进层级,让它和Meta类平级,属于RegistrationSerializer类的成员即可,修正后的序列化器代码如下:

from rest_framework import serializers 
from backApp.models import Client 

class RegistrationSerializer(serializers.ModelSerializer):
    password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True)
    
    class Meta:
        model = Client 
        fields = ['username', 'email', 'password', 'password2']
        extra_kwargs = {
            'password': {'write_only': True}
        }

    # 注意这里缩进,save方法是RegistrationSerializer的方法,不属于Meta
    def save(self):
        client = Client(
            email = self.validated_data['email'], 
            username = self.validated_data['username'],
        )
        password = self.validated_data['password']
        password2 = self.validated_data['password2']
        if password != password2:
            raise serializers.ValidationError({'password': 'Passwords must match'})
        client.set_password(password)
        client.save()
        return client
可选优化建议

密码一致性校验逻辑建议放到序列化器的validate()方法中实现,更符合DRF的校验逻辑规范,不会在调用save的时候才触发校验:

def validate(self, attrs):
    if attrs['password'] != attrs['password2']:
        raise serializers.ValidationError({'password': '两次输入的密码不一致'})
    return attrs

内容的提问来源于stack exchange,提问作者Garde Des Ombres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:24:06