Поиск книг
Часть раздела Модели и панель администратора путешествия по Django на Coddy. Урок 15 из 23.
Вашей полке нужна строка поиска. Страница поиска считывает из адреса введённый посетителем текст. В /search/?q=dune часть после ? — это строка запроса, а Django помещает её пары в request.GET, который работает как словарь. Строка поиска в заголовке — это форма, которая формирует этот адрес за вас; формы рассматриваются в разделе «Формы». Страница для одного жанра могла бы считывать его так:
def by_genre(request):
genre = request.GET.get("genre", "fiction")
books = Book.objects.filter(genre=genre)
return render(request, "books/genre.html", {"genre": genre, "books": books}).get("genre", "fiction") возвращает значение по умолчанию, если в адресе нет genre; в этом случае request.GET["genre"] вызовет ошибку 500. Значения всегда являются текстом: ?page=2 даёт "2". Каждое название содержит пустую строку "", поэтому __icontains="" соответствует каждой строке.
Задание
ЛегкоДобавь страницу поиска. Шаблон books/search.html готов и ожидает q и books.
- В
books/views.pyнапиши представлениеsearch, которое считываетqиз адреса (пустой текст, если параметр отсутствует) и находит книги, в названии которых есть этот текст, независимо от регистра. - В
books/urls.pyдобавь маршрутsearch/с именемsearch.
Нажми «Играть» и выполни поиск по dune в заголовке: в результатах поиска по запросу "dune" будет указана книга Dune, а для xyz появится сообщение «Совпадений нет».
Попробуйте сами
from django.shortcuts import get_object_or_404, render
from .models import Book
def home(request):
books = Book.objects.all()
return render(request, "books/home.html", {"books": books})
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, "books/book_detail.html", {"book": book})
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Модели и панель администратора
Потренируйтесь самостоятельно: Песочница Django