2009-12-18 91 views
0

我发现,在本质上类似于这几个职位,但他们还没有达到100%的清楚,所以这里有云:的Django的ModelForm干净

在我的意见我有一个add_album观点,即允许用户上传一个相册。我想要做的是清理表格(​​)以检查这张专辑是否对于艺术家而言是唯一的。

我​​看起来像这样:

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 

所以这是沿着想什么,我做的东西线。

我的问题是:有没有办法将artist对象从我的视图中传递到表单中,因此我可以在clean方法中使用artist实例?

我认为我在重写方法ModelForm,但我不确定如何去做。

回答

4

更好的方法是在模型层面上使用内置的Meta选项unique_together

如果你已经有了一个模型Album,那么你也许可以做这样的事情:

def Album(models.Model): 
    ... 

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

我想这一点,但它似乎并没有工作。我的“艺术家”字段是艺术家模型的外键。所以我这样做:unique_together =('艺术家','slu'') - 不是100%如何这应该工作。 – tsoporan 2009-12-18 15:49:23

+0

尝试'unique_together =(“artist_id”,“slug”)'。不完全确定'unique_together'是否适用于ForeignKeys。 – 2009-12-18 15:56:32

+0

哦,嘿,我傻了,我忘了这是一个数据库级别的变化(没有运行迁移)。它的工作,谢谢,这是好多了。 – tsoporan 2009-12-18 16:11:06