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

Django测试Teacher创建视图时Major字段验证错误求助

解决Django测试中Teacher创建视图的Major参数验证问题

测试Django项目里的Teacher创建视图时,传入Major参数一直收到错误提示:"Select a valid choice. That choice is not one of the available choices"。试过{'major':self.major.major}、{'major': 'Test Major'}、{'major':[self.major]}、{'major':['Test Major']}等多种传参方式,都没解决问题。

核心原因

Django的ModelForm处理外键字段时,要求传入外键对象的主键(ID),而不是对象本身、字段的文本值,也不需要用列表包裹。

正确传参方式

直接使用Major对象的id或pk属性(两者等价):

'major': self.major.id
# 或者
'major': self.major.pk

为什么之前的方式无效

  • 传self.major:传递的是Major模型对象,表单无法识别这种类型,需要字符串/数字类型的主键值
  • 传self.major.major或'Test Major':这是Major模型major字段的文本内容,但外键字段验证的是主键ID,不是字段文本
  • 传列表形式:外键字段默认是单选控件,不需要用列表包裹参数

修改后的测试代码片段

def test_teacher_create(self):
    response = self.client.post(self.teacher_create, {
        'email': 'test_teacher2@gmail.com',
        'full_name': "Test Teacher 2",
        'password1': '@DylanBergmanN1!',
        'password2': '@DylanBergmanN1!',
        'major': self.major.id  # 这里改为主键值即可解决
    })
    print(response.context['t_form'].errors)

额外注意

如果Major字段允许为空(模型中设置了null=True),测试空值场景时,可以传'major': '',或者在不需要设置Major时省略该字段(需确保表单中该字段未设required=True)。

内容的提问来源于stack exchange,提问作者Dylan Bergmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:04:56