Python Django ModelForm单元测试:使用自定义数据填充字段

Python Django ModelForm单元测试:使用自定义数据填充字段,python,django,modelform,Python,Django,Modelform,我试图用数据填充一个带有自定义字段的模型表单。但是,外键抛出错误: 选择一个有效的选项。这一选择不是可用的选择之一 选择 我无法理解我做错了什么: models.py: from django.db import models class Name(models.Model): first_name = models.CharField(max_length=10) class Surname(models.Model): first_name_key = models.F

我试图用数据填充一个带有自定义字段的模型表单。但是,外键抛出错误:

选择一个有效的选项。这一选择不是可用的选择之一 选择

我无法理解我做错了什么:

models.py:

from django.db import models


class Name(models.Model):
    first_name = models.CharField(max_length=10)

class Surname(models.Model):
    first_name_key = models.ForeignKey(Name)
    last_name = models.CharField(max_length=10)
forms.py:

from django import forms
from population.models import Surname


class SurnameForm(forms.ModelForm):
    age = forms.IntegerField()

    class Meta(object):
        model = Surname
        fields = ['first_name_key', 'last_name', 'age']
以下是我尝试填充modelform的方式:

>> from population.models import Name, Surname
>> from population.forms import SurnameForm
>> f_name = Name(first_name='George')
>> model_data = {'first_name_key': f_name, 'id': 1, 'last_name': 'Taras', 'age': 2}
>> form = SurnameForm(model_data)
>> form.is_valid()
False
>> form.errors
{'first_name_key': ['Select a valid choice. That choice is not one of the available choices.']}

最后,以下代码按预期工作:

>> from population.models import Name, Surname
>> from population.forms import SurnameForm
>> f_name = Name(first_name='George')
>> f_name.save()
>> model_data = {'first_name_key': f_name.pk, 'last_name': 'Taras', 'age': 2}
>> form = SurnameForm(model_data)
>> form.is_valid()
True

您不必传递id关键字,这是可选的。不是传递f_name,而是将其主键作为f_name.pk传递:

model_data = {'first_name_key': f_name.pk, 'last_name': 'Taras', 'age': 2}``

顺便说一下,这似乎是一个奇怪的实现。为什么要创建模型名称。只是好奇。

谢谢你的回答。事实上,我现在不在我的盒子前面,但据我记忆所及,当我使用
f_name.pk
传递主键时,我得到一个错误,指出该值应该是模型
name
的一个实例,顺便说一句,这是一个更复杂构造的例子!但是我必须测试它,然后我会报告回来。没错,我在一次会议上考虑了更多,我认为你必须将模型_数据作为kwargs参数传递。我相应地更新了我的答案。但是当我在我的箱子前面时,我会进行测试。将模型数据作为**kwargs传递会导致错误
TypeError:\uuuuu init\uuuuu()得到一个意外的关键字参数“age”
。第一个解决方案按预期工作。我现在将回滚它