Напишите поисковую систему. Обратите внимание на шаблон index.html: теперь он принимает переменную keyword
и в коде появилась поисковая форма.Допишите код view-функции: она должна вывести на главную страницу посты, в которых есть запрошенное ключевое слово. Форма отправляет запрос методом GET.Запрос сделайте так, чтобы при обращении к свойствам модели author
и group
не порождались дополнительные запросы к базе.
Подсказка:
Свойства модели Post, в которых хранятся связи с другими таблицами, называются author
и group
. Необходимые методы можно перечислить последовательно, через точку.
Код views.py
from django.shortcuts import render from .models import Post, User def index(request): keyword = request.GET.get("q", None) if keyword: posts = Post.objects.select_related('author', 'group').filter(text__contains=keyword) else: posts = None return render(request, "index.html", {"posts": posts, "keyword": keyword})
Код index.html
<!DOCTYPE html> <!-- Based on https://getbootstrap.com/docs/4.4/examples/pricing/ --> <html lang="ru"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <title>Поиск</title> <!-- Bootstrap core CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" /> </head> <body> <div class="container"> <h1>Поиск по записям</h1> <div class="card"> <div class="card-body"> <form class="form-inline" action="/"> <div class="form-row"> <input name="q" class="form-control form-control-lg" type="search" placeholder="Поиск" {% if keyword %}value="{{ keyword }}"{% endif %}> <button class="btn" type="submit">Найти</button> </div> </form> </div> </div> <div class="container"> {% for post in posts %} <strong> Автор: {{ post.author.get_full_name }}, Дата публикации: {{ post.pub_date|date:"d M Y" }}, Группа: {{ post.group.title }} </strong> <p>{{ post.text|linebreaksbr }}</p> <hr> {% endfor %} </div> </div> </body> </html>