Агрегирующие функции в Django ORM — задача

Напишите поисковую систему. Обратите внимание на шаблон 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>


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: