2012-11-18 83 views
0

我有一個模型,可以訪問API和返回JSON數據Django的 - 表單驗證

class Video(models.Model): 
    url = models.URLField(_('URL'), blank=True) 
    type = models.CharField(max_length=10, null=True, blank=True) 

    def get_oembed_info(self, url): 
     api_url = 'http://api.embed.ly/1/oembed?' 
     params = {'url': url, 'format': 'json'} 
     fetch_url = 'http://api.embed.ly/1/oembed?%s' % urllib.urlencode(params) 
     result = urllib.urlopen(fetch_url).read() 
     result = json.loads(result) 
     return result 

    def get_video_info(self): 
    url = self.url 
    result = self.get_oembed_info(url) 
    KEYS = ('type', 'title', 'description', 'author_name') 
    for key in KEYS: 
     if result.has_key(key): 
      setattr(self, key, result[key]) 

    def save(self, *args, **kwargs): 
    if not self.pk: 
     self.get_video_info() 

    super(Video, self).save(*args, **kwargs) 

class VideoForm(forms.ModelForm): 
    def clean(self): 
    if not self.cleaned_data['url'] and not self.cleaned_data['slide_url']: 
     raise forms.ValidationError('Please provide either a video url or a slide url') 
    return self.cleaned_data 

我想在提交表單訪問類型字段,因此,如果類型不是「東西」提出其他像上面的乾淨方法一樣的錯誤。或者我怎樣才能訪問VideoForm類的get_oembed_info方法結果。

解決方案

那麼托馬斯說調用模型的方法清潔,然後做魔術

def clean(self): 
    self.get_video_info() 
    if self.type == 'something': 
     raise ValidationError("Message") 

回答

3

一個ModelForm在其驗證過程是要going to call your model's clean method。該方法可以提高ValidationError的哪些將被添加到您的窗體的錯誤。

因此,您可以在模型的clean方法中實施驗證邏輯,其中get_oembed_info方法可使用self.get_oembed_info()

+0

非常感謝托馬斯的幫助。通過調用模型的乾淨方法,它現在可以很好地工作。 –

+0

@AhmadAjmi很高興能幫到你! –