Показывать поля в фильтре в зависимости от запроса
Я использую django-filter на своем сайте для поиска книг. Фильтр включает следующие поля: жанр книги, язык, на котором написана книга, дата публикации и поле поиска. Поиск ищет по нескольким полям в базе данных, включая название книги, авторов книги и т.д. Фильтр работает нормально, но я не понимаю, как сделать так, чтобы при поиске книги, когда я выбираю одни поля - другие поля удалялись в зависимости от того, есть ли такие объекты. Например, я ищу книгу на китайском языке, выбираю это поле, и у меня после вывода результатов удаляются неиспользуемые жанры. Сейчас у меня отображаются все фильтры, даже если там нет книг. Второй вопрос: могу ли я сделать так, чтобы после поиска я мог видеть, сколько объектов находится в каждом поле? То есть, если я ввел в поиск Гарри Поттер и получил результат, то я вижу, что в английском языке 5 объектов
models.py
class Book(models.Model):
name = models.CharField(max_length=255)
author = models.ForeignKey(
"Authors",
on_delete=models.SET_NULL,
null=True,
blank=True,
)
subject = TreeManyToManyField("Subject")
published_date = models.DateField(blank=True, null=True)
language = models.ForeignKey(
"Language", on_delete=models.SET_NULL, null=True)
class Subject(MPTTModel):
name = models.CharField(
max_length=1000,
unique=True,
)
class Language(models.Model):
name = models.CharField(
max_length=255,
unique=True,
)
class Authors(models.Model):
name = models.CharField(
max_length=255,
unique=True,
)
filters.py
class BookFilter(django_filters.FilterSet):
search = django_filters.CharFilter(
method="my_custom_filter",
widget=TextInput(
attrs={
"class": "form-control",
"placeholder": _("Type to search"),
}
),
)
language = django_filters.ModelMultipleChoiceFilter(
field_name="language",
queryset=Language.objects.order_by("name"),
widget=forms.CheckboxSelectMultiple(),
)
subject = django_filters.ModelMultipleChoiceFilter(
field_name="subject",
queryset=Subject.objects.all(),
widget=autocomplete.ModelSelect2Multiple(}
),
)
class Meta:
model = Book
fields = {
"subject",
"language",
"published_date",
}
def my_custom_filter(self, queryset, name, value):
q = value
return (
queryset.annotate(
rank=SearchRank(vector, q),
similarity=TrigramSimilarity("title", q)
+ similarity=TrigramSimilarity("author", q)
)
views.py
def BookListView(request):
book = Book.objects.all()
filter = BookFilter(request.GET, queryset=book)
context = {
"filter": filter,
"book": book,
}
return render(request, "book.html", context)
book.html
{% extends "base.html" %}
{% block content %}
<form method="get">
{{ filter.form.as_p }}
<input type="submit" />
</form>
{% for obj in filter.qs %}
{{ obj.name }}
<br />
{% endfor %}
{% endblock %}