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'
二、视图层核心错误(无返回结果的主要原因)
- 错误获取用户余额:
Users_Balanc.objects.all()返回所有用户的余额集合,无法直接访问.Amount属性,应获取当前登录用户的专属记录 - 参数获取语法错误:
request.GET.get['username']应为括号调用request.GET.get('username'),且登录状态下直接用request.user即可,无需传递用户名 - 逻辑判断颠倒:当前判断
total.Amount <= Amount意味着余额小于等于提现金额才允许申请,完全不符合业务逻辑 - 保存方法调用错误:
New_Request.save少了括号,未执行实际保存操作 - 外键赋值错误:若
Request模型的user字段是ForeignKey到User,需传入User对象而非用户名字符串 - 响应格式不适配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表单问题
- 未指定提交方式:默认是GET请求,无法触发视图的POST分支,需添加
method="POST" - 冗余字段:登录状态下无需传递
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
相关产品推荐
相关产品推荐

