Настройка Django FilterSet: Создание пользовательского фильтра

У меня есть таблица документов (django-tables2) и FilterSet (django-filter) для ее фильтрации. В целом это работает нормально.

Current 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>&nbsp;
    {% bootstrap_form filter.form layout='inline' form_group_class='my-small-form' %}
    &nbsp;
    {% bootstrap_button '<i class="fas fa-filter"></i>' %}
    &nbsp;
    <a class="btn btn-primary" href='{{ request.path }}'><i class="fas fa-times"></i></a>
</form>
<br/>

Я не уверен в том, как действовать дальше. Как я понимаю, отображаются только поля формы, но я не нашел способа настроить отображение на основе списка результатов.

Итак: С чего начать? Как использовать пользовательское поле FormField или CustomWidget для отображения <option> тегов на основе объекта модели, который они представляют?

Вернуться на верх