У меня есть страница со списком сообщений и формой поиска, чтобы сузить выбор.
Чтобы использовать ввод формы в ListView, я изменил метод get_queryset ():
from django.views import generic
def is_valid_queryparam(param):
return param != '' and param is not None
class PostsListView(generic.ListView):
model = Posts
def get_queryset(self):
qs = Posts.objects.all()
# get parameters from URL, for example
# http://localhost:8000/list/title_contains=example&username_contains=example
title_contains_query = self.request.GET.get('title_contains')
username_contains_query = self.request.GET.get('username_contains')
# filter queryset based on form inputs
if is_valid_queryparam(title_contains_query):
qs = qs.filter(title__icontains=title_contains_query)
if is_valid_queryparam(username_contains_query):
qs = qs.filter(author__username__icontains=username_contains_query)
# then return the filtered queryset
return(qs)
template:
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="form-section">
<form method="GET" action=".">
<div class="form-row">
<div class="form-group col-6">
{{ form.title|as_crispy_field }}
</div>
<div class="form-group col-6">
{{ form.username|as_crispy_field }}
</div>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
{% for post in object_list %}
<div>
<h1>{{ post.title }}</h1>
<h3>{{ post.author }}</h3>
<p> {{ post.content }}</p>
</div>
{% endfor %}
{% endblock content %}
Форма поиска работает хорошо, но проблема в том, что теперь, когда я впервые открываю страницу со списком сообщений, мой список не отображает ничего, пока я не заполню форму поиска и не нажму submit.
Я хотел бы отобразить все сообщения на странице по умолчанию перед заполнением формы поиска для поиска определенных c сообщений.
Каков наилучший способ сделать это?
Обновление: добавлен пример обработки набора запросов с параметрами URL