Как реализовать поиск по нескольким полям?
Здравствуйте уважаемые!
Проблема заключается в реализации поиска по нескольким полям. Имеется БД, где есть: Наименование объекта, структурное подразделение, год и исполнитель. На странице имеется таблица (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>