5


2

Django MTMフィールド:limit_choices_to = other_ForeignKeyField_on_same_model?

私はこのように見えるいくつかの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`を動かそうとしているあらゆる種類の_fun_を持っています。 管理者に、このギャラリーと同じサイトに属する写真の選択肢のみを表示させたいのです。 これは可能ですか?

3 Answer


4


Yes. adminが 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


私は私の Photo`モデルの site`フィールドを削除して Gallery`に ForeignKey`を追加します。 Gallery`モデルの photos`フィールドから `limit_choices_to`を削除します。

ForeignKey`sを 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`フィールドがあるかのように動作するはずです。 しかし、私はそれをテストしていません。

ギャラリーや写真を複数のサイトに表示することを決定した場合、状況は変わります。


0


http://docs.djangoproject.com/en/dev/ref/models/fields/#manytomanyfield[docs]によると、「limit_choices_toは、中間テーブルを持つManyToManyFieldで使用しても効果がありません」。 ManyToManyFieldsは中間テーブルを使用するので、私の読んでは、それはまったく効果がないことを意味します...

管理サイトでは機能させないようにしましたが、あなた自身の見解から、フォームを作成して クエリセットを上書き

form.fields ["photos"]。queryset = request.user.photo_set.all()