Создание представлений (views) в Django
Навигация по проекту |
|
Справочник моделей Django |
В основном создание веб-страниц в Django состоит из трех стадий: определения URL-адреса, написания представления и написания шаблонов. Каждый URL-адрес связывается с конкретным представлением (view), которое обрабатывает данные и затем выводит шаблон страницы, которую в итоге увидят пользователи в браузере. Представление (view) в Django может представлять собой как функцию, так и класс. Для хранения кода представлений (views) изначально предназначается модуль views.py, создаваемый в каждом пакете приложения, но вам никто не мешает поместить код в другие модули. В документации по Django используется термин "view " (вид, представление), но многие их также называют обработчиками, контроллерами или просто вьюхами.
Содержание страницы: |
1. Создание представлений для каталога 2. URL-адреса |
1. Создание представлений для каталога
Для отображения товаров создадим страницу со списком товаров и фильтрации их по категориям. Откройте файл views.py приложения shop и добавьте следующую функцию product_list:
from django.shortcuts import render, get_object_or_404
from .models import Category, Product
def product_list(request, category_slug=None):
"""" Страница списка товаров"""
category = None
categories = Category.objects.all()
products = Product.objects.filter(available=True)
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
products = products.filter(category=category)
context = {'category': category, 'categories': categories, 'products': products}
return render(request, 'shop/product/list.html', context)
Функция render() генерирует ответ на основании данных, полученных от представлений (view). Также мы импортируем из файла models.py наши модели Category, Product, с данными которых мы планируем работать. Функции product_list мы передаем два параметра request и category_slug=None, так как мы фильтруем товары по категориям. В categories мы отправляем запрос к базе данных для получения всех категорий Category.objects.all(). В products мы фильтруем товары по условию available=True, для отображения товаров только из наличия.
В переменной context определяется контекст, который будет передаваться шаблону. Контекст представляет собой словарь, в котором ключами являются имена, используемые в шаблоне для обращения к данным, а значения словаря - данные, которые передаются шаблону.
При построение страницы используются данные функции render(), которая передает объект request, путь к шаблону ('shop/product/list.html'), который мы позже создадим и переменную context. Переменную context можно и не создавать, а просто передать словарь в саму функцию render().
Теперь напишем представление для отображения каждого товара с его подробным описанием. Добавим еще одну функцию product_detail в файл views.py приложения shop:
def product_detail(request, id, slug):
""" Страница продукта"""
product = get_object_or_404(Product, id=id, slug=slug, available=True)
context = {'product': product}
return render(request, 'shop/product/detail.html', context)
Функции product_detail передаются параметры id и slug, для определения нужного товара. Помимо id мы передаем еще и slug, чтобы сгенерировать удобочитаемую ссылку с названием товара. Также это полезно и для SEO оптимизации сайта для поисковых систем.
К продукту мы будем обращаться с помощью вспомогательной функции Django get_object_or_404. Эта функция получает запрошенный объект из базы данных, а если в случае его отсутствия инициирует исключение 404.
2. URL-адреса
Посетители сайта запрашивают страницы вводя URL-адреса или переходят по ссылкам на сайте. На данный момент базовый URL-адрес нашего сайта http://127.0.0.1:8000/, который возвращает сайт, сгенерированный Django по умолчанию.
Откроем файл urls.py основного проекта my_site. Первые две строки импортируют функции и модули, управляющие URL-адресами проекта и административным сайтом. Переменная urlpatterns содержит список из приложений в проекте. Добавим в список наше приложение shop:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('shop.urls')),
]
Теперь в папке приложения shop создадим файл urls.py, где разместим url-адреса представлений которые мы написали в первой части (product_list и product_detail)
from django.urls import path
from . import views
app_name = 'shop'
urlpatterns = [
"""Домашняя страница"""
path('', views.product_list, name='product_list'),
"""Страница по категориям"""
path('<slug:category_slug>/', views.product_list, name='product_list_by_category'),
"""Страница продукта"""
path('<int:id>/<slug:slug>/', views.product_detail, name='product_detail'),
]
Для удобства в начало файла добавляется переменная app_name = 'shop', чтобы было понятно с каким приложением мы работаем.
Шаблон 'product_list' вызовет функцию product_list без дополнительных параметров и будет являться домашней страницей. Шаблон 'product_list_by_category' вызовет функцию product_list и передаст в качестве аргумента слаг, category_slug. Шаблон 'product_detail' вызовет функцию product_detail для отображения страницы товара.
Далее:
Назад: Административный сайт Django