私は3つのオブジェクトを持っています:
Thing
some fields
Bucket
things = models.ManyToManyField(Thing)
User
buckets = models.ManyToManyField(Bucket)
things = models.ManyToManyField(Thing)
管理者の[バケット]フィールドを編集するときに、[モノ]を選択できるようにしたいのですが、現在ログインしているユーザーの[モノ]リストにあるものだけを選択できます。
どうやってやるの?つまり、バケット管理者でモノのリストをフィルタリングするにはどうすればよいですか?
よろしくお願いします。
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)
読む ドキュメント :
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)
Django-selectable または Django-autocomplete-light で可能です。