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

Django ModelForm Unittesting: Populate fields with custom data

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

Select a valid choice. That choice is not one of the available choices.

我不明白我做错了什么:

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']

这是我尝试填充模型的方式:

>> 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}``

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