2009-12-18 5 views
0

J'ai trouvé quelques messages qui sont semblables dans la nature à cela, mais ils ne sont pas 100% clair donc voilà:django ModelForm propre

Dans mon point de vue j'ai une vue add_album qui permet à un utilisateur de télécharger un album. Ce que je voudrais faire est de nettoyer le formulaire (AlbumForm) pour vérifier si cet album est unique pour un artiste.

Mon AlbumForm ressemble à ceci:

class AlbumForm(ModelForm): 
    class Meta: 
    model = Album 
    exclude = ('slug','artist','created','is_valid', 'url', 'user', 'reported') 

    def clean_name(self): 
    super(AlbumForm, self).clean() 
    cd = self.cleaned_data 
    try: 
     Album.objects.get(slug=slugify(cd['name']), artist=artist) 
     raise forms.ValidationError("Looks like an album by that name already exists for this artist.") 
    except Album.DoesNotExist: 
     pass 

    return cd 

Donc c'est quelque chose le long des lignes de ce que je voudrais faire.

Mes questions sont: est-il un moyen de passer l'objet artist de ma vue au formulaire afin que je puisse utiliser cette instance artist dans la méthode clean?

Je pense que je cherche à remplacer la méthode __init__ du ModelForm, mais je ne sais pas comment le faire.

Répondre

4

Une meilleure façon de le faire est au niveau du modèle, avec l'option Meta intégrée, unique_together.

Si vous avez un modèle Album, alors vous pouvez probablement faire quelque chose comme ceci:

def Album(models.Model): 
    ... 

    class Meta: 
    unique_together = ("artist_id", "title") 
+0

J'essaie cela, mais il ne semble pas fonctionner. Mon champ "artiste" est un modèle ForeignKey pour un artiste. Donc je fais: unique_together = ('artiste', 'limace') - pas 100% sur la façon dont cela est censé fonctionner. – tsoporan

+0

Essayez 'unique_together = (" "artist_id", "slug") '. Pas complètement sûr que 'unique_together' fonctionne avec ForeignKeys. –

+0

Oh hey idiot moi, j'ai oublié c'était un changement de niveau de base de données (n'a pas exécuté migrations). Ça marche, merci, c'est beaucoup mieux. – tsoporan

Questions connexes