6

我有几个看起来像这样的 django 模型:

from django.contrib.sites.models import Site

class Photo(models.Model):
    title = models.CharField(max_length=100)
    site = models.ForeignKey(Site)
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self):
        return self.title


class Gallery(models.Model):    
    name = models.CharField(max_length=40)
    site = models.ForeignKey(Site)
    photos = models.ManyToManyField(Photo, limit_choices_to = {'site':name} )    

    def __unicode__(self):
        return self.name

我在尝试制作 Gallery 模型时获得了各种乐趣。limit_choices_to我只希望管理员显示与该画廊属于同一站点的照片的选择。这可能吗?

4

3 回答 3

6

是的。您需要覆盖管理员用于Gallery模型的表单,然后限制该photos表单中字段的查询集:

class GalleryAdminForm(django.forms.ModelForm):

    class Meta:
        model = Gallery

    def __init__(self, *args, **kwargs):
        super(GalleryAdminForm, self).__init__(*args, **kwargs)
        self.fields['segments'].queryset = Photo.objects.filter(site=self.instance.site)


class GalleryAdmin(django.contrib.admin.ModelAdmin):
    form = GalleryAdminForm

django.contrib.admin.site.register(Gallery, GalleryAdmin)
于 2009-12-10T14:03:46.887 回答
2

我会删除模型site上的字段Photo并添加ForeignKeyGallery. 我会limit_choices_to从模型photos上的字段中删除Gallery

因为您使用的是ForeignKeys to Sites,这意味着网站不共享画廊和照片。因此,拥有我上面提到的那些已经没有用了。

class Photo(models.Model):
    title = models.CharField(max_length=100)
    gallery = models.ForeignKey(Gallery, related_name='photos')
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self):
        return self.title


class Gallery(models.Model):    
    name = models.CharField(max_length=40)
    site = models.ForeignKey(Site)

    def __unicode__(self):
        return self.name

在画廊上设置后site,其所有照片都将继承此属性。该网站将可以通过以下方式访问photo_instance.gallery.site

@property
def site(self):
    return self.gallery.site

这应该像你有一个site字段一样工作。但我没有测试过。

如果您决定画廊或照片可以出现在多个站点中,事情就会发生变化。

于 2008-12-05T23:41:56.653 回答
-1

根据文档,“limit_choices_to 在带有中间表的 ManyToManyField 上使用时无效”。根据我的阅读,这意味着它根本没有效果,因为 ManyToManyFields 使用中间表......

我没有尝试让它在管理站点中工作,但是从您自己的角度来看,您可以创建一个表单并覆盖用于填充选项列表的查询集:

form.fields["photos"].queryset = request.user.photo_set.all()
于 2008-12-05T22:41:04.327 回答