2017-08-14 39 views
1

我有以下模式:django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist通過測試django的形式

class Damage(models.Model): 
    kind = models.ForeignKey(Kind, on_delete=models.PROTECT) 
    region = models.ForeignKey(Region, on_delete=models.PROTECT) 

    def clean(self): 
     if self.region not in self.kind.regions.all(): 
      raise ValidationError('not possible') 

和相應的形式:

class DamageForm(forms.ModelForm): 
    class Meta: 
     model = Damage 
     fields = ['kind', 'region'] 

當我運行以下測試,我總是得到django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist: Damage has no region失敗。

def test_empty_input(self): 
    data = { 
     'kind': None, 
     'region': None, 
    } 
    form = DamageForm(data) 
    self.assertFalse(form.is_valid()) 

def test_invalid_input(self): 
    data = { 
     'kind': self.test_kind, 
     'region': self.test_region, 
    } 
    form = DamageForm(data) 
    self.assertFalse(form.is_valid()) 

回答

0

檢查region_idself.kind_idNone試圖訪問self.regionself.kindclean方法之前。

def clean(self): 
    if self.region_id is not None self.kind_id is not None and self.region not in self.kind.regions.all(): 
     raise ValidationError('not possible') 
+0

好吧,讓測試成功運行,'self.region_id不是None'是重要的部分。如果我不使用'self.kind_id'部分,它也可以成功運行。但是,如何在沒有這種補充的情況下創建它也可以工作的區域? – nicksheen

+0

當你提交'data = {'kind':None,'region':self.test_region}'時,你需要檢查'self.kind_id不是None'來防止錯誤。我不明白你的問題,「我如何在沒有這個補充的情況下創建它也可以工作的區域」。 – Alasdair

+0

是的,你完全正確,忘記它;) – nicksheen