Создание представлений (views) в Django
В основном создание веб-страниц в Django состоит из трех стадий: определения URL-адреса, написания представления и написания шаблонов. Каждый URL-адрес связывается с конкретным представлением (view), которое обрабатывает данные и затем выводит шаблон страницы, которую в итоге увидят пользователи в браузере. Представление (view) в Django может представлять собой как функцию, так и класс. Для хранения кода представлений (views) изначально предназначается модуль views.py , создаваемый в каждом пакете приложения, но вам никто не мешает поместить код в другие модули. В документации по Django используется термин «view » (вид, представление), но многие их также называют обработчиками, контроллерами или просто вьюхами.
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 =
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, slug=slug, available=True)
context =
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
urlpatterns = [
«»»Домашняя страница»»»
path(», views. product_list , name= ‘product_list‘ ),
«»»Страница по категориям»»»
path(‘< slug:category_slug >/’, views. product_list , name= ‘product_list_by_category‘ ),
«»»Страница продукта»»»
path(‘< int:id>//’, 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 Create App
Summary: in this tutorial, you’ll learn how to create a new application in a Django project, how to define views, and map the views with URLs.
This tutorial begins where the Getting started with Django tutorial left off.
Django projects and applications
- A project is a Django installation with some settings.
- An application is a group of models, views, templates, and URLs.
A Django project may have one or more applications. For example, a project is like a website that may consist of several applications such as blogs, users, and wikis.
Typically, you design a Django application that can be reusable in other Django projects. The following picture shows the structure of a Django project and its applications:
Creating a blog application
To create an application, you use the startapp command as follows:
python manage.py startapp app_name
Code language: CSS (css)
For example, you can create an application called blog using the startapp command like this:
python manage.py startapp blog
Code language: CSS (css)
The command creates a blog directory with some files:
├── blog | ├── admin.py | ├── apps.py | ├── migrations | ├── models.py | ├── tests.py | ├── views.py | └── __init__.py ├── db.sqlite3 ├── django_project | ├── asgi.py | ├── settings.py | ├── urls.py | ├── wsgi.py | ├── __init__.py | └── __pycache__ └── manage.py
Code language: plaintext (plaintext)
Registering an application
After creating an application, you need to register it to the project especially when the application uses templates and interacts with a database.
The blog app has the apps.py module which contains the BlogConfig class like this:
from django.apps import AppConfig class BlogConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'blog'
To register the blog app, you add the blog.apps.BlogConfig class to the INSTALLED_APPS list in the settings.py of the project:
INSTALLED_APPS = [ # . 'blog.apps.BlogConfig', ]
Code language: Python (python)
Alternatively, you can use the app name like blog in the INSTALLED_APPS list like this:
INSTALLED_APPS = [ # . 'blog', ]
Code language: PHP (php)
Creating a view
The views.py file in the blog directory comes with the following default code:
from django.shortcuts import render # Create your views here.
Code language: Python (python)
A view is a function that takes an HttpRequest object and returns an HttpResponse object.
To create a new view, you import the HttpResponse from the django.http into the views.py file and define a new function that accepts an instance of the HttpRequest class:
from django.shortcuts import render from django.http import HttpResponse def home(request): return HttpResponse('Blog Home
')
Code language: Python (python)
In this example, the home() function returns a new HttpResponse object that contains a piece of HTML code. The HTML code includes an h1 tag.
The home() function accepts an instance of an HttpRequest object and returns an HttpResponse object. It is called a function-based view. Later, you’ll learn how to create class-based views.
To map a URL with the home() function, you create a new file urls.py inside the blog directory and add the following code to the urls.py file:
from django.urls import path from . import views urlpatterns = [ path('', views.home, name='posts'), ]
Code language: Python (python)
First, import the path from django.urls module:
from django.urls import path
Code language: Python (python)
Second, import the views.py module from the current directory.
from . import views
Code language: Python (python)
Note that this is a relative import that imports the views module from the current directory.
Third, define a route that maps the blog URL with the home() function using the path() function.
urlpatterns = [ path('', views.home, name='posts'), ]
Code language: Python (python)
The name keyword argument defines the name of the route. Later, you can reference the URL using the posts name instead of using the hard-code URL like blog/ .
By using the name for the path, you can change the URL of the path to something else like my-blog/ in the urls.py instead of changing the hard-coded URL everywhere.
Note that the final argument of the path must be a keyword argument like name=’posts’ . If you use a positional argument like this:
from django.urls import path from . import views urlpatterns = [ path('', views.home, 'posts'), # Error ]
Code language: Python (python)
you’ll get the following error:
TypeError: kwargs argument must be a dict, but got str.
Code language: plaintext (plaintext)
To make the blog’s routes work, you need to include the urls.py of the blog application in the urls.py file of the Django project:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls')), ]
Code language: Python (python)
In the urls.py of the project, we import the include function from the django.urls and map the path of the blog to the blog.urls .
By doing this, when you navigate to http://127.0.0.1:8000/blog/ , Django will run the home() function of the views.py module and returns a webpage that displays a h1 tag.
Before opening the URL, you need to start the Django development web server:
python manage.py runserver
Code language: Python (python)
When you navigate to http://127.0.0.1:8000/blog/ , you’ll see a webpage that displays the Blog Home heading.
- First, the web browser sends an HTTP request to the URL http://127.0.0.1:8000/blog/
- Second, Django executes the urls.py in the django_project directory. It matches the blog/ with the URL in the urlpatterns list in the urls.py . As a result, it sends » to the urls.py of the blog app.
- Third, Django runs the urls.py file in the blog application. It matches the » URL with the views.home function and execute it, which returns an HTTP response that outputs a h1 tag.
- Finally, Django returns a webpage to the web browser.
Adding more routes
First, define the about() function in the views.py of the blog application:
from django.shortcuts import render from django.http import HttpResponse def home(request): return HttpResponse('Blog Home
') def about(request): return HttpResponse('About
')
Code language: Python (python)
Second, add a route to the urls.py file:
from django.urls import path from . import views urlpatterns = [ path('', views.home, name='posts'), path('about/', views.about, name='about'), ]
Code language: Python (python)
Third, open the URL http://127.0.0.1:8000/blog/about/ , and you’ll see a page that displays the about page.
Now, if you open the home URL, you’ll see a page that displays a page not found with a 404 HTTP status code.
The reason is that the urls.py in the django_project doesn’t have any route that maps the home URL with a view.
To make the blog application the homepage, you can change the route from blog/ to » as follows:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')), ]
Code language: Python (python)
If you open the URL http://127.0.0.1:8000 , you’ll see the blog home page. And navigating to the URL http://127.0.0.1:8000/about/ will take you to the about page.
Summary
- A Django project contains one or more applications.
- A Django application is a group of models, views, templates, and URLs.
- Use python manage.py startapp app_name command to create a new Django application.
- Define a function in the views.py file to create a function-based view.
- Define a route in the urls.py file of the application to map a URL pattern with a view function.
- Use the include() function to include the urls.py of app in the urls.py of the project.