Добавление фильтров к полям автозаполнения в django
У меня вопрос об автозаполнении полей в django.
Предположим, что у нас есть эти 2 модели:
class Animal:
name = models.CharField()
is_big = models.BooleanField()
class Human:
pet = models.ForeignKey(Animal)
Затем у нас есть файл администратора, который выглядит примерно так:
class HumanAdmin(admin.ModelAdmin):
autocomplete_fields = ['pet']
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'pet':
kwargs["queryset"] = Animal.objects.filter(is_big=True)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
class AnimalAdmin(admin.ModelAdmin):
search_fields = ['name']
admin.site.register(Animal, AnimalAdmin)
admin.site.register(Human, HumanAdmin)
Я хотел добиться того, чтобы в выпадающем списке выбора животных были только крупные животные, что сработало, и затем я решил сделать этот список автозаполняемым, но после того, как я сделал его автозаполняемым, похоже, что он игнорирует мой фильтр formfield_for_foreignkey, теперь он загружает всех животных.
И я хочу спросить, как мне правильно объединить эти два варианта? Мне нужно поле автозаполнения для животных, но я хочу, чтобы оно учитывало только тех, у кого есть is_big == True .
Моя идея заключается в том, что я должен каким-то образом перехватить то, что вводится в текстовом поле автозаполнения, и добавить это в мою фильтрацию, но я не уверен, как это сделать.
Попытка отменить get_search_result внутри AnimalAdmin
class AnimalAdmin(admin.ModelAdmin):
search_fields = ['name']
def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super().get_search_results(
request,
queryset,
search_term,
)
queryset = queryset.filter(is_big=True)
return queryset, use_distinct