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

Django模型实例判断失效及Ajax提交无响应问题求助

解决用户提现请求功能失效及Ajax重载问题

一、模型层问题

FloatField无需设置max_length参数(该参数对浮点型字段无效),金额类字段更推荐用DecimalField(避免浮点精度误差):

class Users_Balanc(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # 替换FloatField为DecimalField,指定精度
    Amount = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    Profit = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    Bonus = models.DecimalField(max_digits=10, decimal_places=2, default=10.00)
    Referral_Bonus = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    Deposit = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    Withdrawals = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
            
    def __str__(self):
        return f'{self.user.username} Users_Balanc'

二、视图层核心错误(无返回结果的主要原因)

  1. 错误获取用户余额:Users_Balanc.objects.all()返回所有用户的余额集合,无法直接访问.Amount属性,应获取当前登录用户的专属记录
  2. 参数获取语法错误:request.GET.get['username']应为括号调用request.GET.get('username'),且登录状态下直接用request.user即可,无需传递用户名
  3. 逻辑判断颠倒:当前判断total.Amount <= Amount意味着余额小于等于提现金额才允许申请,完全不符合业务逻辑
  4. 保存方法调用错误:New_Request.save少了括号,未执行实际保存操作
  5. 外键赋值错误:若Request模型的user字段是ForeignKey到User,需传入User对象而非用户名字符串
  6. 响应格式不适配Ajax:Ajax请求更适合返回JSON格式响应,方便前端处理

修正后的视图代码:

from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from decimal import Decimal

@login_required(login_url='/login')
def withdrawals(request):
    # 获取当前登录用户的余额记录,不存在则返回404
    user_balance = get_object_or_404(Users_Balanc, user=request.user)
    
    if request.method == 'POST':
        try:
            # 获取并转换提现金额为Decimal类型
            withdraw_amount = request.POST.get('Amount')
            withdraw_amount = Decimal(withdraw_amount)
            
            # 正确判断:提现金额 <= 用户可用余额
            if withdraw_amount <= user_balance.Amount:
                # 创建提现请求(假设Request模型的user是ForeignKey到User)
                Request.objects.create(value=withdraw_amount, user=request.user)
                # 可选:扣除用户余额(根据业务需求)
                # user_balance.Amount -= withdraw_amount
                # user_balance.Withdrawals += withdraw_amount
                # user_balance.save()
                
                return JsonResponse({'status': 'success', 'message': 'Request sent successful'})
            else:
                return JsonResponse({'status': 'error', 'message': 'Insufficient funds'})
        except (ValueError, TypeError):
            return JsonResponse({'status': 'error', 'message': 'Invalid amount format'})
    else:
        return render(request, 'dashboard/withdrawals.html', {'total': user_balance})

三、HTML表单问题

  1. 未指定提交方式:默认是GET请求,无法触发视图的POST分支,需添加method="POST"
  2. 冗余字段:登录状态下无需传递username,直接用request.user即可

修正后的表单代码:

<form id="post-form" method="POST">
    {% csrf_token %}                              
    
    <div class="form-group">
        <h5 class="text-light">Amount</h5>
        <input class="form-control text-light bg-dark" placeholder="TRX Amount" type="number" step="0.01" name="Amount" required>
    </div>

    <div class="form-group">
        <h5 class="text-light">Enter withdrawal password</h5>
        <!--<input class="form-control text-light bg-dark" placeholder="Password" type="text" name="otpcode">-->
        <small class="text-light">If you forgot your password, you can contact admin</small>
    </div> 
    
    <div class="form-group">
        <input class="btn btn-danger" type='submit' value="Complete Request"/>
    </div>
</form>

四、Ajax请求修正(阻止页面重载并处理响应)

拦截表单默认提交行为,发送POST请求并带上CSRF令牌,处理返回的JSON响应:

document.getElementById('post-form').addEventListener('submit', function(e) {
    // 阻止表单默认提交(避免页面重载)
    e.preventDefault();
    
    const formData = new FormData(this);
    
    fetch(window.location.href, {
        method: 'POST',
        body: formData,
        headers: {
            'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
        }
    })
    .then(response => response.json())
    .then(data => {
        // 根据返回结果提示用户
        alert(data.message);
        // 可选:刷新余额显示或重置表单
        // document.getElementById('post-form').reset();
    })
    .catch(error => {
        console.error('Error:', error);
        alert('An error occurred, please try again');
    });
});

额外注意事项

  • 确保Request模型的user字段定义正确:user = models.ForeignKey(User, on_delete=models.CASCADE)
  • 生产环境中需添加表单验证(如提现金额不能为0或负数)
  • 处理Users_Balanc记录不存在的情况(比如新用户注册时自动创建余额记录)

内容的提问来源于stack exchange,提问作者Dino Corry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:50:52