我有几个看起来像这样的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
我正在尝试各种 fun 试图让limit_choices_to
处理Gallery模型。我只希望管理员显示与此图库属于同一网站的照片的选项。这可能吗?
答案 0 :(得分:4)
是。您需要覆盖管理员用于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)
答案 1 :(得分:1)
我会删除site
模型上的Photo
字段,并将ForeignKey
添加到Gallery
。我会从limit_choices_to
型号上的photos
字段中删除Gallery
。
因为您使用ForeignKey
来Site
s,这意味着网站不会共享图库和照片。因此,我上面提到的那些已经没用了。
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
字段一样。但我还没有测试过它。
如果您认为图库或照片可以出现在多个网站中,那么事情就会发生变化或过程。
答案 2 :(得分:0)
根据docs,“limit_choices_to在具有中间表的ManyToManyField上使用时无效”。通过我的阅读,这意味着它完全没有效果,因为ManyToManyFields使用中间表......
我没有尝试在管理员网站中使用它,但是根据您自己的观点,您可以创建一个表单,override the queryset用于填充选项列表:
form.fields["photos"].queryset = request.user.photo_set.all()