Как реализовать поиск по нескольким полям?

Здравствуйте уважаемые!

Проблема заключается в реализации поиска по нескольким полям. Имеется БД, где есть: Наименование объекта, структурное подразделение, год и исполнитель. На странице имеется таблица (4 поля) и одна кнопка поиска, юзер вводит значение в поля или же будет выпадающий список (список значений в БД для определенного поля). Вот собственно сам вопрос, как реализовать и возможно ли выполнить поиск с строгими значениями с выпадающего списка? хотя бы знать куда копать.

Спасибо, уже который день мучаюсь.

Модель

class Year(models.Model):
    title = models.CharField(max_length=4, verbose_name='Год')
    slug = models.SlugField(max_length=4, verbose_name='Slug Год', unique=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Год'
        verbose_name_plural = 'Год'
        ordering = ['title']

lass Subject(models.Model):
    title = models.CharField(max_length=100, verbose_name='Наименование объекта')
    slug = models.SlugField(max_length=100, verbose_name='Slug Наименование объекта', unique=True)

    
    def __str__(self):
        return self.title

    class Meta:
        
        verbose_name = 'Наименвоание объекта'
        verbose_name_plural = 'Наименвоание объекта'
        ordering = ['title']


class Post(models.Model):
    title = models.CharField(max_length=100, verbose_name='Пост', blank=False, null=True, )
    slug = models.SlugField(max_length=100, verbose_name='Slug Пост', unique=True)
    content = models.TextField(blank=True, verbose_name='Контент')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Опубликовано')
    document = models.FileField(upload_to='doc/%Y/', blank=False, null=True, verbose_name='Документ')
    # Название = в скобках ссылка на модель Subject.
    # Задает название связи постов с моделью Subject (related_name='posts')
    year = models.ForeignKey(Year, on_delete=models.PROTECT, related_name='posts', blank=False, null=True,
                             verbose_name='Год')
    subject = models.ForeignKey(Subject, on_delete=models.PROTECT, related_name='posts', blank=False, null=True,
                                verbose_name='Наименование объекта')
    division = models.ForeignKey(Division, on_delete=models.PROTECT, related_name='posts', blank=False, null=True,
                                 verbose_name='Подразделения')
    executor = models.ForeignKey(Executor, on_delete=models.PROTECT, related_name='posts', blank=False, null=True,
                                 verbose_name='Исполнитель')
    surveys = models.ForeignKey(Surveys, on_delete=models.PROTECT, related_name='posts', blank=False, null=True,
                                verbose_name='Вид обследования')
    format = models.ForeignKey(Format, on_delete=models.PROTECT, related_name='posts', blank=False, null=True,
                               verbose_name='Формат документа')

    def __str__(self):
        return self.title

    def get_absolute_url(self):       
        return reverse('post', kwargs={"slug": self.slug})


    class Meta:
        verbose_name = 'Пост'
        verbose_name_plural = 'Пост'
        ordering = ['-created_at']

url приложения

from django.urls import path
from .views import *

    urlpatterns = [
        
        path('', Home.as_view(), name='home'),    
        path('surveys/<str:slug>', PostBySurveys.as_view(), name='surveys'),
        path('post/<str:slug>', get_post, name='post')
    ]

вьюс

class Home(ListView):
    model = Post

    template_name = 'blog/index.html'
    context_object_name = 'posts'


    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context ['title'] = 'G'
        return context



class PostBySurveys(ListView):
    template_name = 'blog/index.html'
    context_object_name = 'posts'
    allow_empty = False

    def get_queryset(self):
        return Post.objects.filter(surveys__slug=self.kwargs['slug'])


    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context ['title'] = Surveys.objects.get(slug=self.kwargs['slug'])
        return context

выпадающий список

<select class="form-select" aria-label="Default select example" style="margin-top: 10px; background-color: darkgray;">
    <option selected>Название объекта</option>
        {% for s in subjects %}
            <option>{{ s.title }}</option>
        {% endfor %}

    </select>
<select class="form-select" aria-label="Default select example" style="margin-top: 10px; background-color: darkgray;">
    <option selected>Подразделение</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
</select>
<select class="form-select" aria-label="Default select example" style="margin-top: 10px; background-color: darkgray;">
    <option selected>Испонитель</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>

Таблица

<tbody>
{% for post in posts %}
<tr>


    <th scope="row">{{ post.id }}</th>

    <td><a href="{{ post.get_absolute_url }}"> {{ post.subject }} </a></td>

    <td><a> {{ post.division }} </a></td>

    <td><a> {{ post.created_at|date:"d.m.y" }} </a></td>

    <td><a href="{{ post.document.url }}" download="">
        <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="top"
                title="{{ post.document }}">Скачать
        </button>
    </a></td>

    <td><a> {{ post.executor }} </a></td>


</tr>
{% endfor %}
</tbody>
Вернуться на верх