Для того чтобы правильно отфильтровать через связанное поле ManyToMany с помощью django-filters, следует выполнить несколько шагов.
1. Установить пакет django-filter
, если он еще не установлен:
pip install django-filter
2. Создать фильтр, наследуясь от FilterSet
:
import django_filters from myapp.models import MyModel class MyModelFilter(django_filters.FilterSet): tags = django_filters.ModelMultipleChoiceFilter(field_name='tags', to_field_name='name', queryset=Tag.objects.all()) class Meta: model = MyModel fields = ['tags']
3. Добавить представление, используя фильтр:
from myapp.filters import MyModelFilter def my_model_list(request): filter = MyModelFilter(request.GET, queryset=MyModel.objects.all()) return render(request, 'my_template.html', {'filter': filter})
4. Добавить соответствующий URL-шаблон:
urlpatterns = [ path('', my_model_list, name='my_model_list'), ]
5. Наконец, добавить код для отображения фильтра в шаблоне:
<form method="get"> {{ filter.form.as_p }} <button type="submit">Filter</button> </form> <ul> {% for obj in filter.qs %} <li>{{ obj.name }}</li> {% endfor %} </ul>
Теперь при посещении страницы my_model_list
вы увидите форму фильтра и результаты, отфильтрованные по выбранным тегам. В данном примере фильтр работает через связанное поле ManyToMany tags
модели MyModel
.