2012-11-18 3 views
0

J'ai un modèle qui peut accéder à api et renvoyer des données JSONDjango - la validation du formulaire

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 

Je veux accéder au champ de type tout en soumettant la forme, de sorte que si le type est autre que raise « quelque chose » une erreur comme dans la méthode propre ci-dessus. Ou comment puis-je accéder au résultat de la méthode get_oembed_info dans la classe VideoForm.

Solution

Bien que Thomas dit à appeler la méthode propre du modèle, puis faire la magie

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

Répondre

3

Un ModelForm va going to call your model's clean method au cours de son processus de validation. Cette méthode peut déclencher ValidationError qui sera ajouté aux erreurs de votre formulaire.

Vous pouvez donc implémenter votre logique de validation dans la méthode clean de votre modèle, où la méthode get_oembed_info est disponible en utilisant self.get_oembed_info().

+0

Merci beaucoup Thomas pour votre aide. Cela fonctionne maintenant très bien en appelant la méthode propre du modèle. –

+0

@AhmadAjmi Content de pouvoir aider! –

Questions connexes