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

如何自定义登录接口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的适配配置:

  1. 修改序列化器代码,显式声明字段:
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
  1. 在项目settings.py中修改simplejwt配置,指定登录鉴权字段为account_id,适配账号登录逻辑:
SIMPLE_JWT = {
    # 保留原有其他simplejwt配置,新增以下配置
    'USERNAME_FIELD': 'account_id',
}

验证结果

修改完成后重启服务,传入空account_id请求接口,将返回自定义的错误提示:

{
  "account_id": [
    "账号ID不能为空"
  ]
}

内容的提问来源于stack exchange,提问作者Abdul Rahman.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:15:38