如何自定义登录接口account_id为空时的默认错误提示信息
问题场景复现
登录接口传入空account_id参数:
{ "account_id":"", "password":"abdu@123" }
接口默认返回的错误响应:
{ "account_id": [ "This field may not be blank." ] }
尝试通过继承重写CharField的default_error_messages修改空白提示,未生效。当前使用的序列化器继承自TokenObtainPairSerializer,User模型以account_id作为唯一标识字段。
失效原因
自定义字段不生效的核心原因:
- 自定义的
MyField未在序列化器中实际引用,序列化器校验时仍调用DRF原生CharField TokenObtainPairSerializer默认使用username作为登录校验字段,不会自动加载模型字段或全局自定义字段的错误配置
正确实现方式
不需要单独重写全局CharField,直接在序列化器中显式声明account_id字段,绑定自定义错误信息即可,同时补充simplejwt的适配配置:
- 修改序列化器代码,显式声明字段:
from rest_framework import serializers from rest_framework_simplejwt.serializers import TokenObtainPairSerializer from django.utils.translation import gettext_lazy as _ class MyTokenObtainPairSerializer(TokenObtainPairSerializer): # 显式声明登录用的account_id字段,直接定义错误提示 account_id = serializers.CharField( error_messages={ 'blank': _('账号ID不能为空'), # 替换为你需要的提示文案 'invalid': _('账号格式不合法'), 'max_length': _('账号ID长度不能超过255位') } ) password = serializers.CharField(write_only=True) @classmethod def get_token(cls, user): token = super().get_token(user) # 原有自定义token声明逻辑保持不变 return token def validate(self, attrs): data = super().validate(attrs) # 原有返回数据扩展逻辑保持不变 data.update({"user_id": self.user.account_seq}) data.update({"account_id": self.user.account_id}) data.update({"is_migrated": int(self.user.is_migrated)}) data.update({"role": self.user.authority}) return data
- 在项目
settings.py中修改simplejwt配置,指定登录鉴权字段为account_id,适配账号登录逻辑:
SIMPLE_JWT = { # 保留原有其他simplejwt配置,新增以下配置 'USERNAME_FIELD': 'account_id', }
验证结果
修改完成后重启服务,传入空account_id请求接口,将返回自定义的错误提示:
{ "account_id": [ "账号ID不能为空" ] }
内容的提问来源于stack exchange,提问作者Abdul Rahman.
相关产品推荐
相关产品推荐

