Django:从模型实例创建绑定表单

时间:2012-07-24 15:07:55

标签: django unit-testing django-forms

我正在尝试在Django中编写我的第一个单元测试。这是一份员工登记表。 表单的Staff模型与UserProfile(AUTH_PROFILE_MODULE)具有OneToOne关系。 UserProfile与django.contrib.auth.models.User具有OneToOne关系。

我正在使用https://github.com/dnerdy/factory_boy为人员模型创建测试模型实例。我的想法是使用StaffFactory,这样我就可以轻松创建测试模型实例。要创建绑定表单,我需要传递一个数据字典。我认为在测试表单时使用 django.forms.models.model_to_dict 将我的模型实例转换为数据字典会很方便。

现在,我的问题是:model_to_dict不会遍历我的Staff模型的外键(Staff-> UserProfile-> User)。这意味着表单保持无效,因为表单数据中仍然缺少用户电子邮件等必填字段。

目前我的StaffRegistrationFormTest看起来像:

class StaffRegistrationFormTest(unittest.TestCase):
  def test_success(self):
    staff1 = StaffFactory()

    form = StaffRegistrationForm(model_to_dict(staff1))
    # print jsonpickle.encode(model_to_dict(staff1))
    self.assertTrue(form.is_valid(), form.errors)

有没有办法传入一个dict,通过重用模型实例来序列化外键?

1 个答案:

答案 0 :(得分:2)

因此,似乎解决这个问题的一种方法是为Staff模型的OneToOne字段创建其他字典并合并它们。

这使测试通过:

    data = dict(model_to_dict(staff1).items() + 
        model_to_dict(staff1.profile).items() +
        model_to_dict(staff1.profile.user).items())
    form = StaffRegistrationForm(data=data)
    self.assertTrue(form.is_valid(), form.errors)

我不确定这是否是最佳实践的方法。如果这完全不利于谷物,请随意评论。