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

Django UpdateView测试断言错误:credit_purpose字段未更新

Django UpdateView测试断言失败问题排查与修复

核心问题分析

你的测试中POST请求返回200状态码,说明表单验证未通过,数据根本没被保存到数据库,所以调用refresh_from_db()后credit_purpose还是原值。UpdateView在更新成功后会返回302重定向,返回200意味着表单无效,页面被重新渲染。

可能的原因及修复方案

1. ApplicationForm未包含credit_purpose字段

检查你的ApplicationForm定义,确保credit_purpose(来自父类AbstractCredit)被包含在表单的字段列表中:

class ApplicationForm(forms.ModelForm):
    class Meta:
        model = Application
        fields = ['credit_purpose', 'customer', 'credit_amount', ...]  # 必须包含要修改的字段

如果表单没声明该字段,提交的credit_purpose会被Django表单忽略,自然不会更新到数据库。

2. POST请求缺少必填字段

Django模型表单会验证所有必填字段,你的测试只传递了credit_purpose,其他必填字段(比如customer、credit_amount等)缺失,导致表单验证失败。

修改测试中的POST数据,补充所有必填字段的值:

def test_application_update(self):
    application = Application.objects.create(...)  # 原创建代码不变

    # 构造包含所有必填字段的表单数据,基于已有对象的属性修改目标字段
    update_data = {
        'credit_purpose': 'House Loan',
        'customer': self.customer.id,
        'credit_amount': 10000,
        'credit_term': 12,
        'credit_pledge': self.pledge.id,
        'product': self.product.id,
        'repayment_source': self.repayment.id,
        'status': self.status.id,
        'credit_user': self.user.id,
        # 根据你的模型和表单要求,补充其他必填字段
    }

    response = self.client.post(
        reverse('application_update', kwargs={'pk': application.id}),
        update_data
    )

    # 更新成功应该返回302重定向,而非200
    self.assertEqual(response.status_code, 302)
    application.refresh_from_db()
    self.assertEqual(application.credit_purpose, 'House Loan')

3. 修正状态码断言

原测试断言response.status_code == 200是错误的,UpdateView更新成功后会跳转到get_success_url()指定的页面,返回302状态码。如果返回200,直接说明表单验证失败,这也是你数据没更新的直接信号。

额外排查点

  • 检查BasePermissionMixin是否限制了测试用户的权限,如果权限不足会返回403,而非200,可以在测试中添加登录用户或赋予相应权限:
self.client.force_login(self.user)  # 确保测试用户已登录且有权限
  • 确认credit_purpose字段在AbstractCredit中是可编辑的,没有被设置为editable=False。

内容的提问来源于stack exchange,提问作者Veronika Lyu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:25:52