Создание представлений (views) в Django

Навигация по проекту
  1. Создание проекта в Django

  2. Создание моделей в Django для онлайн-магазина

  3. Административный сайт Django

  4. Создание представлений (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 renderget_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