0

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

フォームの送信中にタイプフィールドにアクセスしたいので、タイプが「何か」以外の場合は、上記のcleanメソッドのようにエラーが発生します。または、VideoFormクラスのget_oembed_infoメソッドの結果にアクセスするにはどうすればよいですか。

解決

トーマスがモデルのクリーンメソッドを呼び出してから魔法をかけると言ったように

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

1 に答える 1

3

AModelFormは、検証プロセス中にモデルのメソッドを呼び出します。cleanそのメソッドは、フォームのエラーに追加される'sを発生させる可能性があります。ValidationError

したがって、を使用してメソッドを使用できるモデルのcleanメソッドに検証ロジックを実装できます。get_oembed_infoself.get_oembed_info()

于 2012-11-18T21:39:19.120 に答える