У меня есть ситуация, когда я хочу использовать административный виджет автозаполнения Django, который учитывает ограничение поля ссылочных моделей.
Например, у меня есть следующая Collection
модель с атрибутом kind
с указанными вариантами выбора.
class Collection(models.Model):
...
COLLECTION_KINDS = (
('personal', 'Personal'),
('collaborative', 'Collaborative'),
)
name = models.CharField()
kind = models.CharField(choices=COLLECTION_KINDS)
...
Другая модель ScheduledCollection
ссылается на Collection
с полем ForeignKey
, которое реализует опцию limit_choices_to
. Цель этой модели - связать метаданные с Collection
для конкретного варианта использования.
class ScheduledCollection(models.Model):
...
collection = models.ForeignKey(Collection, limit_choices_to={'kind': 'collaborative'})
start_date = models.DateField()
end_date = models.DateField()
...
Обе модели зарегистрированы с ModelAdmin
. Модель Collection
реализует search_fields
.
@register(models.Collection)
class CollectionAdmin(ModelAdmin):
...
search_fields = ['name']
...
Модель ScheduledCollection
реализует autocomplete_fields
@register(models.ScheduledCollection)
class ScheduledCollectionAdmin(ModelAdmin):
...
autocomplete_fields = ['collection']
...
Это работает, но не совсем так, как ожидалось. Автозаполнение извлекает результаты из представления, созданного моделью Collection
. limit_choices_to
не фильтрует результаты и применяется только после сохранения.
Было предложено реализовать get_search_results
или get_queryset
на модели CollectionAdmin
. Я смог сделать это и отфильтровать результаты. Однако это меняет Collection
результаты поиска по всем направлениям. Я не знаю, как получить больше контекста в get_search_results
или get_queryset
для условной фильтрации результатов на основе отношений.
В моем случае я хотел бы иметь несколько вариантов для Collection
и несколько метамоделей с различными параметрами limit_choices_to
и иметь функцию автозаполнения с учетом этих ограничений.
Я не ожидаю, что это будет работать автоматически, и, возможно, это должен быть запрос функции. На данный момент я не знаю, как отфильтровать результаты автозаполнения в отношении ограничения выбора (или любого условия).
Без использования autocomplete_fields
виджет по умолчанию для администратора Django <select>
фильтрует результаты.