2012-07-24 52 views
3

我想在Django中編寫我的第一個單元測試。這是工作人員登記表格。 表單的Staff模型與UserProfile(AUTH_PROFILE_MODULE)具有OneToOne關係。 UserProfile與django.contrib.auth.models.User具有OneToOne關係。Django:從模型實例創建綁定表單

我使用https://github.com/dnerdy/factory_boy來爲員工創造模型測試模型實例。這個想法是使用一個StaffFactory,所以我可以輕鬆創建測試模型實例。要創建綁定表單,我需要將它傳遞給數據字典。我認爲使用django.forms.models.model_to_dict將測試表單時我的模型實例轉換爲數據字典會很方便。現在

,我的問題是:model_to_dict不經過我的員工模型(Staff-> UserProfile->用戶)的外鍵。這意味着表單保持無效,因爲用戶的電子郵件等必填字段在表單數據中仍然缺失。

目前我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) 

有沒有辦法在一個字典,其中外鍵是由模型實例使用重新序列通過?

+0

upvote for clear sourcing for model_to_dict()。這讓我今天節省了一個小時。 – BobHy 2015-11-28 01:44:07

回答

2

這樣看來,如果解決這個的一種方式是通過爲員工模型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) 

我不知道這是否是在最佳實踐方面要走的路。隨意評論,如果這完全反對糧食。

相關問題