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

ギャラリー モデルの作業を行うために、あらゆる種類の楽しみを持っています。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から削除します。photosGallery

ForeignKeys to sを使用しているためSite、サイトがギャラリーや写真を共有していないことを意味します。したがって、私が上で述べたものを持っていることはすでに役に立たない.

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

docsによると、「 limit_choices_to は、中間テーブルを持つ ManyToManyField で使用すると効果がありません」。ManyToManyFields は中間テーブルを使用するため、私の読書では、それはまったく効果がないことを意味します...

管理サイトで機能させることは試みていませんが、独自のビューから、フォームを作成し、選択肢のリストを入力するために使用されるクエリセットをオーバーライドできます。

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