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
相关产品推荐
相关产品推荐

