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

