Настройка Django FilterSet: Создание пользовательского фильтра
У меня есть таблица документов (django-tables2) и FilterSet (django-filter) для ее фильтрации. В целом это работает нормально.
Я хочу создать пользовательский ModelChoiceFilter (или ChoiceFilter) для отображения элементов в двухуровневой иерархии (дерево с родительскими узлами и одним уровнем дочерних):
+ Category 1
+ Subcategory 1.1
+ Subcategory 1.2
+ Category 2
+ Subcategory 2.1
+ Subcategory 2.2
Нет необходимости разворачивать и сворачивать дерево, я просто хочу показать их упорядоченными по категориям и отобразить их немного по-разному, если они первого или второго уровня. Никогда не присутствует более двух уровней, и каждый компонент верхнего уровня имеет по крайней мере одного ребенка.
Мой текущий FilterSet выглядит следующим образом:
class DocumentFilter(FilterSet):
title_name = CharFilter(lookup_expr='icontains')
place_name = CharFilter(lookup_expr='icontains')
source_type = ModelChoiceFilter(queryset=SourceType.objects.all().order_by('type_name'))
doc_start_date = DateFromToRangeFilter()
class Meta:
model = Document
fields = ['title_name', 'source_type', 'place_name', 'doc_start_date']
Моя модель для SourceType выглядит следующим образом:
class SourceType(models.Model):
type_name = models.CharField(verbose_name="archivalienart",
max_length=50,)
parent_type = models.ForeignKey('self',
verbose_name="übergeordnete Archivalienart",
on_delete=models.CASCADE,
null=True,
blank=True,
related_name="child_type",)
Шаблон формы фильтра выглядит следующим образом:
{% load bootstrap4 %}
<form action="{{ request.path }}" method="get" class="form form-inline">
<i class="fas fa-filter"></i>
{% bootstrap_form filter.form layout='inline' form_group_class='my-small-form' %}
{% bootstrap_button '<i class="fas fa-filter"></i>' %}
<a class="btn btn-primary" href='{{ request.path }}'><i class="fas fa-times"></i></a>
</form>
<br/>
Я не уверен в том, как действовать дальше. Как я понимаю, отображаются только поля формы, но я не нашел способа настроить отображение на основе списка результатов.
Итак: С чего начать? Как использовать пользовательское поле FormField или CustomWidget для отображения <option> тегов на основе объекта модели, который они представляют?