Программа курса:

1.1 - Как работает интернет и веб-сайты 1.2 - Краткий конспект по HTML 1.3 - Кратко о SQL
2.1 - Что такое Django? 2.2 - Основные принципы MVC 2.3 - Установка Django и создание проекта HelloWorld 2.4 - Диспетчер URL, часть 1. 2.5 - Диспетчер URL, часть 2. 2.6 - Шаблоны, часть 1. 2.7 - Шаблоны, часть 2. 2.8 - Введение в тестирование приложений
3.1 - Создание проекта, первые модели и админ-панель 3.2 - Модели в Django и их поля 3.3 - Первые ORM запросы CRUD 3.4 - Организация связей между таблицами 3.5 - Django ORM методы возвращающие QuerySet 3.6 - Django ORM методы которые не возвращают QuerySet 3.7 - Django ORM поисковые поля и агрегатные функции 3.8 - Views/Templates/URLs
4.1 - Формы в Django 4.2 - CRUD проект
5.1 - Создание проекта и приложения 5.2 - Создание моделей данных блога 5.3 - Сайт администрирования 5.4 - Работа с наборами запросов QuerySet и менеджерами 5.5 - Разработка представлений списка и детальной информации 5.6 - Создание шаблонов представлений 5.7 - Итоги работы
6.1 - Работа с URL 6.2 - Добавление постраничной разбивки 6.3 - Разработка представлений на основе классов 6.4 - Рекомендация постов по электронной почте 6.5 - Создание системы комментариев 6.6 - Добавление функциональности тегирования 6.7 - Извлечение постов по сходству 6.8 - Реализация конкретно-прикладных шаблонных тегов и фильтров 6.9 - Добавление карты сайта 6.10 - Установка базы данных PostgreSQL 6.11 - Добавление полнотекстового поиска в блог
7.1 - Введение в пользовательскую систему Django 7.2 - Использование системы аутентификации Django 7.3 - Доработки системы авторизации и регистрации добавление сессий 7.4 - Профили пользователей и пользовательские поля модели User 7.5 - Авторизация через социальные сети посредством OAuth 2.0 7.6 - Улучшаем дизайн блога с использованием Bootstrap 5 7.7 - Итоги работы
8.1 - Введение в REST API 8.2 - Django REST Framework на примере блога 8.3 - Сериализаторы 8.4 - Представления 8.5 - Фильтрация и поиск 8.6 - Пагинация 8.7 - Права доступа и токены в DRF 8.8 - Схемы и документация 8.9 - Итоги работы
9.1 - Покупка VPS, доменного имени, привязка DNS и настройка по SSH. 9.2 - Установка виртуального окружения Gunicorn и списка зависимостей 9.3 - Установка PostgreSQL, настройка и перенос БД 9.4 - Установка и настройка NGINX 9.5 - Получение SSL сертификата от Lets Encrypt и настройка HTTPS
10.1 - Начало работы, создание модели статей 10.2 - Создание древовидной модели категорий 10.3 - Представления на основе классов 10.4 - Работа с ListView, вывод списка статей 10.5 - Работа с DetailView, форматирование и обработка кириллицы в Slug 10.6 - Вывод дерева категорий, пагинация, добавление Bootstrap 5 10.7 - Оптимизация SQL запросов и установка Debug-Toolbar 10.8 - Профили пользователей. Модели и сигналы 10.9 - Профили пользователей. Представления и формы. 10.10 - Работа с CreateView. Добавление записей пользователями. 10.11 - Работа с UpdateView. Обновление записей пользователями. 10.12 - Использование миксинов в работе с представлениями Django 10.13 - Доработки системы авторизации и регистрации 10.14 - Итоги работы
11.1 - Создание древовидных комментариев 11.2 - Создание древовидных комментариев, добавление JavaScript 11.3 - Добавление функциональности тегирования 11.4 - Добавление ReCAPTCHA для форм 11.5 - Интеграция WYSIWYG-редактора, установка CKEditor 5 11.6 - Создание системы Like/Dislike 11.7 - Добавление RSS ленты для блога 11.8 - Кеширование и Middleware для получения статуса пользователей 11.9 - Свои шаблоны для страниц ошибок 403, 404 11.10 - Итоги работы

Создание проекта HelloWorld

 

Работа с представлениями и адресами.

Обратите внимание, что модель, представление и url из шаблона MVT присутствуют с самого начала.
Единственное, чего не хватает - это шаблона, который мы добавим в ближайшее время.

Несмотря на то, что наше новое приложение существует в проекте Django, Django не "знает" о нем, пока мы явно не добавим его в файл Course_FirstProject/settings.py.


В текстовом редакторе откройте этот файл и прокрутите ниже до INSTALLED_APPS, где вы увидите шесть встроенных приложений Django. Именно в этот список необходимо добавить наше приложение blog, это можно сделать двумя способами, рассмотрим их поподробнее:

1 способ: когда указывается путь к конфигурационному классу приложения, добавим blog.apps.BlogConfig в самый низ этого списка:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig', # путь к конфигурационному классу нашего приложения
]

 

В данном примере путь blog.apps.BlogConfig, где blog приложение, apps - модуль(файл blog/apps.py), BlogConfig конфигурационный класс.

Такой способ позволяет задать имя используемого конфигурационного класса(их может быть несколько в файле apps.py) через файл настроек.

Код конфигурационного класса BlogConfig можно посмотреть в файле blog/apps.py, файл с ним был создан автоматически вместе с приложением. Давайте откроем этот файл и посмотрим на его содержимое:

from django.apps import AppConfig


class BlogConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'blog'

 


2 способ: когда указывается только имя приложения, в данном случае blog:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog', # имя нашего приложения
]

 

При указании имени приложения Django ищет конфигурационный класс в файле apps.py данного приложения.

  • Если там их несколько, то используется тот, у которого значение атрибута default = True.
  • Если он один, то будет использоваться он, вне зависимости от значения атрибута default.
  • Если нет ни одного, тогда будет использоваться базовый класс AppConfig из django.apps.


В большинстве случаев можно использовать 2й способ, указывая только имя приложения. Точный путь к конфигурационному классу следует использовать когда их несколько в файле apps.py, это удобнее чем устанавливать в файле apps.py атрибут default = True для нужного конфигурационного класса.


Не волнуйтесь, если на этом этапе вы запутались: чтобы понять, как устроены проекты и приложения Django, нужна практика. В течение этого курса мы создадим несколько проектов и приложений, и вскоре эти паттерны станут привычными.

 

Добавление Hello, World

В Django для работы одной динамической (она же связана с базой данных) веб-страницы требуется четыре отдельных файла, соответствующих этому шаблону MVT:

  • models.py
  • views.py
  • template.html (HTML файл шаблона)
  • urls.py


Однако для создания статической веб-страницы (не связанной с базой данных) мы можем жестко передать данные в представлении, так что модель не нужна. Именно это мы и сделаем здесь, чтобы не усложнять ситуацию. Далее мы будем использовать модель во всех наших проектах.


Поэтому следующим шагом будет создание нашего первого представления. Начнем с обновления файла views.py в нашем приложении blog, чтобы он выглядел следующим образом:

blog/views.py:

from django.http import HttpResponse


def homepageview(request):
    return HttpResponse('Hello, World!')

 

Мы импортируем класс HttpResponse из Django, чтобы мы могли его использовать в нашем коде. Функция представления ( homepageview ) принимает объект request, который содержит всю информацию о запросе. Далее мы создаем и возвращаем объект HttpResponse, передавая ему строку 'Hello, World!'. Эта строка, которая и будет отправлена в теле HTTP-ответа.

 

В Django существует два типа представлений: представления на основе функций (FBV) и представления на основе классов (CBV). Наш код в этом примере представляет собой представление на основе функций: оно относительно простое в реализации и явное.

Django начинался с функциональных представлений (FBV), но затем были введены классовые представления (CBV), которые значительно улучшили переиспользование кода, позволили соблюдать принцип DRY и упростили расширение функциональности за счет миксинов. Дополнительная абстракция CBVs делает их довольно мощными и лаконичными, однако это также делает их более сложными для чтения новичками в Django.

Поскольку веб-разработка быстро становится повторяющейся, Django также поставляется с рядом встроенных общих представлений на основе классов (GCBVs) для обработки общих случаев использования, таких как создание нового объекта, формы, представления списка, пагинация и так далее. Мы будем активно использовать GCBVs в этом курсе в последующих разделах.

Таким образом, технически существует три способа написания представления в Django: представления на основе функций (FBVs), представления на основе классов (CBVs) и общие представления на основе классов (GCBVs). Эта настройка полезна для опытных разработчиков, но сбивает с толку новичков.

Многие разработчики Django предпочитают использовать GCBVs, когда это возможно, и возвращаются к CBVsили FBVs, когда это необходимо. К концу этого курса вы будете использовать все три подхода и сможете решить, какой из них вам больше нравится.


Далее нам нужно настроить наши URL-адреса. Создайте новый файл urls.py в приложении blog. Затем обновите его следующим кодом:

blog/urls.py:

from django.urls import path
from .views import homepageview

urlpatterns = [path('', homepageview, name='home'), ]


В верхней строке мы импортируем функцию path из Django, для создания нашего нового маршрута, а в следующей строке мы импортируем наши представления.

Ссылаясь на файл views.py, как на .views, мы говорим Django искать в текущей директории(в директории текущего приложения) файл views.py, и импортировать оттуда функцию-представление homepageview.


Наш добавленный маршрут состоит из трех частей:

  1. Шаблон URL адреса для корневой директории сайта ''.
  2. Используемая функция-представление homepageview.
  3. Имя маршрута home, это необязательный именованный параметр name функции path.

Другими словами, если пользователь запрашивает домашнюю страницу(корневую директорию сайта /), Djangoдолжен использовать представление под названием homepageview.

Более подробнее с диспетчером URL мы познакомимся в следующем разделе.


На этом мы почти закончили. Последний шаг - это обновление нашего файла Cource_FirstProject/urls.py.

Обычно в рамках одного проекта Django существует несколько приложений, например, страницы, и каждому из них нужен свой собственный маршрут.

Cource_FirstProject/urls.py:

from django.contrib import admin
from django.urls import path, include  # new

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),  # new
]


Новый маршрут, определённый с помощью функции include, ссылается на маршруты URL-адресов, определенные в приложении blog, чтобы они были включены в рамки пути корневой директории сайта /. Указанные шаблоны вставляются в рамки именного пространства(namespace) blog.

Теперь каждый раз, когда пользователь заходит на домашнюю страницу, он будет сначала перенаправляться в приложение blog, а затем в представление homepageview, заданное в файле blog/urls.py. Именные пространства должны быть уникальными для всего проекта. Подробнее о пространствах имен для маршрутов мы поговорим в следующих разделах.

Необходимость в двух отдельных файлах urls.py часто сбивает с толку новичков. Думайте о верхнем уровне Cource_First_Project/urls.py как о шлюзе к различным маршрутам, характерным для каждого приложения.

Теперь у нас есть весь необходимый код. Чтобы убедиться, что всё работает, как ожидалось, перезапустите наш сервер Django:

python manage.py runserver

 

Откройте в браузере  http://127.0.0.1:8000/  и там появится Hello, World!, а не дефолтная страница Django:


В этом разделе мы рассмотрели множество фундаментальных концепций. Мы создали наше первое Django-приложение и узнали о структуре проекта/приложения Django. Мы начали изучать представления, маршруты и внутренний веб-сервер Django.

Если у вас возникли трудности, вы можете клонировать проект с гитхаба - https://github.com/Permin0ff/Cource_FirstProject

Перейти к следующему шагу

Возникли вопросы при прочтении лекции? Задайте вопрос в комментариях

Комментарии