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

Django实时显示收款人名称问题:账号存在却提示‘Account Not Found’

转账时输入收款人账号无法实时获取用户姓名的问题排查与解决

在转账场景中,付款人输入收款人账号后需实时展示CustomUser模型的name字段,但数据库中存在该账号的情况下,始终提示“Account Not Found”,以下是具体排查点和解决方法:

1. 数据类型不匹配导致查询失败

前端AJAX传递的账号是字符串类型,而Account模型的account_number是IntegerField,直接用字符串查询整数字段会匹配失败,触发Account.DoesNotExist异常。

修复代码(视图层):

from django.http import JsonResponse
from .models import Account

def get_receiver_info(request):
    if request.method == 'POST':
        receiver_account_number = request.POST.get('account_number')
        try:
            # 将字符串转换为整数后再查询
            receiver_account_number = int(receiver_account_number)
            receiver_account = Account.objects.get(account_number=receiver_account_number)
            receiver_user = receiver_account.user

            response_data = {
                'name': receiver_user.name,
            }

            return JsonResponse(response_data)
        except (Account.DoesNotExist, ValueError):
            # 同时捕获账号不存在和类型转换失败的异常
            return JsonResponse({'error': 'Account not found'}, status=404)
    # 非POST请求统一返回JSON错误
    return JsonResponse({'error': 'Invalid request method'}, status=400)

2. CSRF令牌缺失导致请求被拦截

Django默认对POST请求做CSRF验证,前端AJAX未携带CSRF令牌会被拒绝,直接进入error回调,误显示“Account Not Found”。

修复代码(模板层):

<input type="number" id="account_number" placeholder="收款人账号">
<p>收款人姓名: <span id="receiver_name"></span></p>

<!-- 渲染Django CSRF令牌隐藏字段 -->
{% csrf_token %}

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    $(document).ready(function() {
        // 获取页面中的CSRF令牌
        const csrfToken = $('input[name="csrfmiddlewaretoken"]').val();
        
        $('#account_number').on('input', function() {
            let url = "{% url 'Get_Receiver_Infor' %}";
            var accountNumber = $(this).val();
            
            // 根据实际账号长度调整判断条件,示例为非空且长度≥6位
            if (accountNumber && accountNumber.length >= 6) {
                $.ajax({
                    url: url,
                    type: 'POST',
                    dataType: 'json',
                    // 在请求头中携带CSRF令牌
                    headers: {
                        'X-CSRFToken': csrfToken
                    },
                    data: {account_number: accountNumber},
                    success: function(data) {
                        $('#receiver_name').text(data.name);
                    },
                    error: function(xhr) {
                        // 根据响应状态码显示对应提示
                        $('#receiver_name').text(xhr.status === 404 ? 'Account Not Found' : '请求失败,请重试');
                    }
                });
            } else {
                $('#receiver_name').text('请输入合法的收款人账号');
            }
        });
    });
</script>

3. 账号长度判断逻辑不合理

原前端代码判断accountNumber.length >9,若合法账号长度≤9位,将永远无法触发AJAX请求,只会显示“请重试,出现异常”,易被误认为账号不存在。

修复建议:
根据实际业务的账号长度规则调整判断条件,比如改为:

// 示例:匹配6-12位的账号
if (accountNumber && accountNumber.length >=6 && accountNumber.length <=12) {
    // 执行AJAX请求逻辑
}

内容的提问来源于stack exchange,提问作者Adamu Abdulkarim Dee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:52:42