Django filter添加筛选框实现选择功能

我想为Dashboard这个页面新增一个搜索功能,
如图所示,我现在已经实现了通过查找port的名字,并返回所有带有这个名字的port的文档。
而Port这个类和UtilisateurService用户服务机构这个类是多对多的关系,一个用户服务机构可以与多个Port相关联,他们之间是用port_set相连接,
我现在想通过搜索UtilisateurService中的nom_service也就是用户服务机构的名称,返回对应的多个Port相关联的所有文档,请问这该如何实现?

models.py

class OperationDragage(models.Model):
    
    STATUT_VALIDATION_CHOICES = (
        ('Saisie en cours', 'Saisie en cours'),
        ('Soumise - attente validation', 'Soumise - attente validation'),
        ('Validée Cerema', 'Validée Cerema')
    )
    
    id_operation = models.CharField(_('id opération dragage'), max_length=100, null=True, blank=True)
    annee_record_number = models.IntegerField(_('Numéro identification année'), null=True, blank=True)
    imported = models.BooleanField(_('Importé'), default=False)
    annee = models.IntegerField(_('année'))
    drag_vol = models.FloatField(_('Entrer le volume dragué sur la zh (x1000 m3)'), max_length=100, null=True, blank=True)
    drag_qms_decl = models.FloatField(_('Entrer la QMS totale draguée sur la zh (x1000m3)'), max_length=100, null=True, blank=True)
    drag_qms_calc = models.FloatField(_('QMS calculée par le CEREMA'), max_length=100, null=True, blank=True)
    statut_validation = models.CharField(
        _('statut de validation'),
        max_length=100,
        choices=STATUT_VALIDATION_CHOICES,
        default=STATUT_VALIDATION_CHOICES[0][0],
        blank=True,
        null=True
    )

    zh_drag = models.ForeignKey(
        ZHDrag,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_('zh drag')
    )

    def __str__(self):
        return self.id_operation

class UtilisateurService(models.Model):
    nom_service = models.CharField(_('nom du service'), max_length=100)
    courriel_service = models.EmailField(_('courriel du service'), blank=True, null=True)

    departement_set = models.ManyToManyField(Departement)
    port_set = models.ManyToManyField(Port)
    user_set = models.ManyToManyField(User)

    def __str__(self):
        return self.nom_service


filter.py

class DashboardFilter(FilterSet):

    custom_filter = django_filters.CharFilter(method='_custom_filter', label='Filtrer (id opération, ZHD, port, commune)')
    annee = django_filters.NumberFilter()
    statut_validation = django_filters.ChoiceFilter(choices=OperationDragage.STATUT_VALIDATION_CHOICES)

    def _custom_filter(self, queryset, name, value):
        return queryset.filter(
            Q(id_operation__icontains=value) |
            Q(zh_drag__zhd_nom__icontains=value) |
            Q(zh_drag__port__port__icontains=value) |
            Q(zh_drag__port__commune__nom__icontains=value)
        )

    class Meta:
        model = OperationDragage
        fields = ()


tables.py

class UtilisateurServiceTable(tables.Table):

    edit = EditImageColumn('utilisateur-service-update', args=[A('pk')], orderable=False, empty_values=())

    class Meta:
        model = UtilisateurService
        fields = ('nom_service', 'courriel_service', 'edit')
        sequence = fields
        per_page = 20

        attrs = {'class': 'table table-bordered table-striped'}


class DashboardTable(tables.Table):

    edit = EditImageColumn('operation-dragage-update', args=[A('pk')], orderable=False, empty_values=())

    class Meta:
        model = OperationDragage
        fields = ('id_operation', 'zh_drag', 'zh_drag__port', 'zh_drag__port__commune', 'statut_validation', 'edit')
        sequence = fields
        per_page = 20

        attrs = {'class': 'table table-bordered table-striped'}

html

{% extends "layouts/base.html" %}
{% load i18n core_tags %}


{% block title %}
    {# Translators: Operation dragage head title #}
    {% trans "Operation dragage list" %}
{% endblock %}

{% block content %}

    {# Translators: Operation dragage list title #}
    {% trans "Operation dragage list" as title %}


    {% show_header_title title %}

    <!-- Main content -->
    <section class="content">
        <div class="container-fluid">   
            <div class="row">
            <div class="col-md-12">
                <div class="card card-primary">
                <div class="card-header">
                    {# Translators: Operation dragage title #}
                    <h3 class="card-title">{% trans "Operation dragage list" %}</h3>
                </div>
                <div class="card-body">

                    <div class="row">
                        <div class="col-3">{% trans "Port" %}</div>
                        <div class="col-3">{{ zh_drag.port }}</div>
                        <div class="col-3">{% trans "Commune" %}</div>
                        <div class="col-3">{{ zh_drag.port.commune }}</div>
                    </div>
                    <div class="row">
                        <div class="col-3">{% trans "ZH drag" %}</div>
                        <div class="col-9">{{ zh_drag }}</div>
                    </div>
                    
                    {# Translators: Operation dragage create button #}
                    <a class="btn btn-primary" href="{% url "operation-dragage-create" %}">{% trans "Create" %}</a>

                    {% include "table.html" with table=table %}
                    {% if not table.data %}
                        {# Translators: Operation dragage list any operation dragage #}
                        <p>{% trans "Any operation dragage" %}</p>          
                    {% endif %} 
                </div>
            </div>
            </div>
        </div>
    </section>    

{% endblock %}


这个确实好像可以用前端就能实现,学python的时候我只是对filter有所耳闻,希望能帮到你
Django中可以利用filter与simple_tag为前端自定义函数来实现
详见这篇文章https://www.bbsmax.com/A/gVdnqbPE5W/
望采纳啦谢谢

直接参考官网示例
https://django-filter.readthedocs.io/en/stable/

可以参考一下,希望对你有帮助!
https://wenku.baidu.com/view/63fa189df221dd36a32d7375a417866fb94ac050.html

这个是不是前端能实现?为啥要用后端写