Django——表单验证

Django——表单验证,django,django-forms,Django,Django Forms,我有一个可以访问Api并返回json数据的模型 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?'

我有一个可以访问Api并返回json数据的模型

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
我希望在提交表单时访问type字段,因此如果类型不是“something”,则会引发类似于上述clean方法中的错误。或者如何访问VideoForm类中的get_oembed_info方法结果

解决方案 正如Thomas所说,调用模型的clean方法,然后执行魔术

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

在验证过程中,
ModelForm
将被删除。该方法会引发
验证错误
,该错误将添加到表单的错误中


因此,您可以在模型的
clean
方法中实现验证逻辑,其中使用
self可以使用
get\u oembed\u info
方法。get\u oembed\u info()

在验证过程中,将使用
ModelForm
方法。该方法会引发
验证错误
,该错误将添加到表单的错误中


因此,您可以在模型的
clean
方法中实现验证逻辑,其中
get\u oembed\u info
方法可以使用
self.get\u oembed\u info()

非常感谢Thomas的帮助。通过调用模型的clean方法,它现在运行得非常好。@AhmadAjmi很高兴我能提供帮助!非常感谢托马斯的帮助。通过调用模型的clean方法,它现在运行得非常好。@AhmadAjmi很高兴我能提供帮助!