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

Django表单测试报错AssertionError: False is not True求助

解决Django表单测试is_valid()失败问题

问题描述

在测试用户注册视图的POST数据有效性时,执行self.assertTrue(form.is_valid())抛出AssertionError: False is not true,推测是表单验证失败导致。

排查步骤与解决方案

1. 先查看表单具体错误信息

最直接的方式是在测试代码中打印表单的错误信息,定位具体问题:
修改测试方法,在断言前添加错误打印:

def test_signup_post_form(self):
    form_data = {
        'email': self.email,
        'first_name': 'Adam',
        'last_name': 'Smith',
        'password1': 'qazxswedcvfr',
        'password2': 'qazxswedcvfr',
    }
    form = CustomUserCreationForm(data=form_data)
    # 打印错误信息,快速定位问题
    print(form.errors)
    self.assertTrue(form.is_valid())
    form.save()
    self.assertEqual(get_user_model().objects.count(), 1)

运行测试后,控制台会输出表单验证失败的具体字段和原因,比如字段缺失、密码不匹配、邮箱格式错误等。

2. 确保CustomUserCreationForm正确定义

你提供的代码中缺少CustomUserCreationForm的实现,这很可能是核心问题。因为你的CustomUser替换了默认的username为email,必须自定义表单适配这个模型:

方案一:继承UserCreationForm

from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ('email', 'first_name', 'last_name', 'password1', 'password2')

方案二:自定义ModelForm

如果需要更灵活的验证逻辑,可以直接继承ModelForm:

from django import forms
from .models import CustomUser

class CustomUserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='密码', widget=forms.PasswordInput)
    password2 = forms.CharField(label='确认密码', widget=forms.PasswordInput)

    class Meta:
        model = CustomUser
        fields = ('email', 'first_name', 'last_name')

    def clean_password2(self):
        # 验证两次密码是否一致
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("两次密码输入不一致")
        return password2

    def save(self, commit=True):
        # 保存加密后的密码
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

3. 修正测试代码中的表单初始化方式

测试中不需要创建HttpRequest对象,直接将POST数据作为data参数传给表单即可(你当前的写法虽然能运行,但不符合规范):

def test_signup_post_form(self):
    form_data = {
        'email': self.email,
        'first_name': 'Adam',
        'last_name': 'Smith',
        'password1': 'qazxswedcvfr',
        'password2': 'qazxswedcvfr',
    }
    # 直接传入data参数初始化表单
    form = CustomUserCreationForm(data=form_data)
    self.assertTrue(form.is_valid())
    form.save()
    self.assertEqual(get_user_model().objects.count(), 1)

4. 其他可能的排查点

  • 密码复杂度:如果使用默认的UserCreationForm,会检查密码是否符合Django的默认密码规则(比如不能全是字母、长度至少8位等),你的测试密码qazxswedcvfr长度足够,但如果规则更严格,可能需要调整测试密码。
  • 邮箱唯一性:确保测试中使用的邮箱example@gmail.com在测试执行前未被创建,可以在测试类的setUp方法中清理用户数据:
def setUp(self):
    get_user_model().objects.all().delete()

内容的提问来源于stack exchange,提问作者Chidera Ferdinand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:55:24