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
相关产品推荐
相关产品推荐

