Django фильтрует много для многих полей в admin?
У меня есть три объекта:
Thing
some fields
Bucket
things = models.ManyToManyField(Thing)
User
buckets = models.ManyToManyField(Bucket)
things = models.ManyToManyField(Thing)
При редактировании поля "Bucket" в администраторе я хочу иметь возможность выбирать "Вещи", но только те вещи, которые находятся в списке "Вещи" для пользователя, который в настоящий момент вошел в систему.
Как я могу это сделать? Другими словами, как я могу отфильтровать список вещей в администраторе Bucket?
Благодарим вас за помощь заблаговременно.
Ответы
Ответ 1
Прочитайте документы:
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)
Ответ 2
Существует formfield_for_manytomany. Использование похоже на ответ, заданный defuz.
ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs)¶
Как и метод formfield_for_foreignkey
, метод formfield_for_manytomany
можно переопределить, чтобы изменить default formfield для многого поля. Например, если владелец может владеть несколькими автомобилями, а автомобили могут принадлежать нескольким владельцам - многие для многих отношений - вы можете отфильтровать поле внешнего ключа Car для отображаются только автомобили, принадлежащие Пользователю:
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)
Ответ 3
Возможно с django-selectable или django-autocomplete-light.