web-dev-qa-db-ja.com

Django adminの多対多フィールドをフィルタリングしますか?

私は3つのオブジェクトを持っています:

Thing
  some fields

Bucket
  things = models.ManyToManyField(Thing)

User
  buckets = models.ManyToManyField(Bucket)
  things = models.ManyToManyField(Thing)

管理者の[バケット]フィールドを編集するときに、[モノ]を選択できるようにしたいのですが、現在ログインしているユーザーの[モノ]リストにあるものだけを選択できます。

どうやってやるの?つまり、バケット管理者でモノのリストをフィルタリングするにはどうすればよいですか?

よろしくお願いします。

23
Andrew

formfield_for_manytomany があります。使用法はdefuzによって与えられた答えに似ています。

ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs)¶

以下のような formfield_for_foreignkeyメソッド、formfield_for_manytomanyメソッドをオーバーライドして、多対多フィールドのデフォルトのフォームフィールドを変更できます。たとえば、所有者が複数の車を所有でき、車が複数の所有者に属することができる場合(多対多の関係)、[車の外部キー]フィールドをフィルタリングして、ユーザーが所有する車のみを表示できます。

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "cars":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
31
arunkumar

読む ドキュメント

class BucketAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "things":
             kwargs["queryset"] = Things.objects.filter(...)
        return super(BucketAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
25
defuz

Django-selectable または Django-autocomplete-light で可能です。

0
jpic