Блог (Blog)
● Суть: Сайт, где администратор (вы) может публиковать статьи (посты), а
пользователи могут их читать.
● Модели (Models):
○ Post (Пост): с полями title (заголовок), content (содержимое),
pub_date (дата публикации).
○ Category (Категория): (опционально, для усложнения) с полем
name и связью ForeignKey к Post.
● Что изучает студент:
○ Создание моделей и миграции базы данных.
○ Работу с Admin-панелью (добавление, редактирование постов).
○ Views (Представления): Создание "списка постов" (list view) и
"детальной страницы" (detail view).
○ URLs (Маршруты): Как сделать красивые URL (например,
/post/my-first-post/).
○ Templates (Шаблоны): Как вывести данные в HTML, используя
циклы ({% for %}) и переменные ({{ [Link] }}).
Создание проекта "Блог"
Шаг 1: Настройка проекта и виртуальной среды
Первым делом, откройте командную строку (CMD или PowerShell).
Перейдите в вашу рабочую папку:
cd C:\django
Создайте виртуальную среду. Это изолированное окружение, чтобы не
смешивать библиотеки разных проектов. Назовем ее venv.
python -m venv venv
Активируйте ее:
venv\Scripts\activate
(Ваша командная строка теперь должна начинаться с (venv))
Установите Django:
pip install django
Создайте проект Blog. Обратите внимание на точку . в конце — она говорит
Django создать проект прямо в текущей папке (C:\django), а не создавать
лишнюю вложенную папку.
django-admin startproject Blog .
Что изучает студент: Вы только что использовали django-admin для
создания скелета проекта. У вас появился файл [Link] (для
управления проектом) и папка Blog (с настройками).
Создайте "приложение" (app) posts. В Django проект (Project) — это весь
сайт. Приложение (App) — это отдельный модуль сайта (например, блог,
форум, магазин).
Bash
python [Link] startapp posts
Что изучает студент: Вы создали отдельный, переиспользуемый
модуль posts, где будет вся логика, связанная с постами.
Зарегистрируйте приложение в проекте. Откройте файл C:\django\Blog\
[Link] в вашем редакторе кода. Найдите список INSTALLED_APPS и
добавьте 'posts' (или '[Link]') в конец.
Python
# C:\django\Blog\[Link]
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'posts', # <-- ДОБАВЬТЕ ЭТУ СТРОКУ
]
Шаг 2: Создание моделей (Models)
Модель — это Python-класс, который описывает таблицу в базе данных.
1. Откройте файл C:\django\posts\[Link].
2. Напишем нашу модель Post.
3. Python
# C:\django\posts\[Link]
from [Link] import models
class Post([Link]):
title = [Link](max_length=200, verbose_name="Заголовок")
content = [Link](verbose_name="Содержимое")
pub_date = [Link](auto_now_add=True, verbose_name="Дата
публикации")
def __str__(self):
return [Link]
class Meta:
verbose_name = "Пост"
verbose_name_plural = "Посты"
ordering = ['-pub_date'] # Сортировка по-умолчанию (новые сверху)
● Что изучает студент:
○ [Link]: Вы наследуете свой класс от этого, чтобы Django
"понял", что это модель.
○ CharField, TextField, DateTimeField: Это типы полей, которые
превращаются в типы колонок в SQL-базе.
○ auto_now_add=True: Автоматически ставит дату и время создания
поста.
○ __str__(self): Это "человекочитаемое" имя объекта. Вы увидите
[Link] в админке вместо "Post object (1)".
○ Meta: Дополнительные настройки. verbose_name — имя в админке,
ordering — как сортировать посты при извлечении из базы.
Шаг 3: Миграции базы данных
Вы описали модели, но в базе данных (пока это db.sqlite3 в папке проекта) этих
таблиц еще нет. Миграции — это "инструкции" для базы, как ей измениться.
Создайте файл миграции:
Bash
python [Link] makemigrations posts
(Django проанализирует posts/[Link] и создаст файл в posts/migrations/,
описывающий создание таблицы Post).
Примените миграцию к базе:
Bash
python [Link] migrate
(Эта команда выполнит все необработанные миграции, включая встроенные от
Django (для пользователей, админки) и нашу новую).
● Что изучает студент: Вы поняли двухэтапный процесс изменения схемы
БД: makemigrations (создать чертеж) и migrate (построить по чертежу).
Шаг 4: Админ-панель (Admin)
Django дает вам "из коробки" мощную админ-панель.
Создайте супер-пользователя (администратора):
Bash
python [Link] createsuperuser
(Следуйте инструкциям: введите логин, email (можно пропустить) и пароль).
Зарегистрируйте модель в админке. Откройте C:\django\posts\[Link] и
добавьте Post.
Python
# C:\django\posts\[Link]
from [Link] import admin
from .models import Post # Импортируем нашу модель
[Link](Post) # Регистрируем ее
Проверьте! Запустите сервер:
Bash
python [Link] runserver
Откройте в браузере [Link]
Войдите, используя логин и пароль, которые вы только что создали.
Вы должны увидеть секцию "POSTS" и модель "Посты".
Нажмите "Добавить" и создайте 2-3 тестовых поста.
● Что изучает студент: Вы научились "включать" свои модели в админку с
помощью [Link]() и управлять контентом сайта без написания
кода.
Шаг 5: Представления (Views)
View (представление) — это функция или класс, который принимает веб-запрос
и возвращает веб-ответ. Он решает, какие данные и как (в каком шаблоне)
показать пользователю.
Мы будем использовать "Class-Based Views" (CBV) — это современный и
удобный способ.
1. Откройте C:\django\posts\[Link].
2. Нам нужно два представления: список всех постов и страница одного
поста.
3. Python
# C:\django\posts\[Link]
from [Link] import ListView, DetailView
from .models import Post
class PostListView(ListView):
model = Post
template_name = 'posts/post_list.html' # Шаблон, который будет
использоваться
context_object_name = 'posts' # Имя переменной в шаблоне
class PostDetailView(DetailView):
model = Post
template_name = 'posts/post_detail.html' # Шаблон для одного поста
context_object_name = 'post' # Имя переменной в шаблоне
● Что изучает студент:
○ ListView: Встроенный класс, который "знает", как получить список
объектов ([Link]()) и передать его в шаблон.
○ DetailView: Встроенный класс, который "знает", как получить один
конкретный объект (по его id или pk из URL) и передать его в
шаблон.
○ template_name: Вы явно указываете, какой HTML-файл рендерить.
○ context_object_name: Вы задаете имя переменной, которую будете
использовать в HTML (например, {% for post in posts %}).
Шаг 6: Маршруты (URLs)
URLs — это "диспетчер" Django. Он смотрит на URL, который запросил
пользователь, и решает, какое представление (view) должно его обработать.
Это двухэтапный процесс.
1. Главный [Link] (Проекта)
Откройте C:\django\Blog\[Link]. Нам нужно "подключить" все URL-адреса
из нашего приложения posts.
2. Python
# C:\django\Blog\[Link]
from [Link] import admin
from [Link] import path, include # <-- Убедитесь, что 'include' есть
urlpatterns = [
path('admin/', [Link]),
path('', include('[Link]')), # <-- ДОБАВЬТЕ ЭТУ СТРОКУ
]
Что изучает студент: Вы сказали главному диспетчеру: "Все, что
приходит на главный адрес сайта ( '' ), перенаправляй на обработку в
файл [Link]".
[Link] (Приложения)
Этого файла нет, его нужно создать:
Создайте файл C:\django\posts\[Link].
Python
# C:\django\posts\[Link] (НОВЫЙ ФАЙЛ)
from [Link] import path
from .views import PostListView, PostDetailView # Импортируем наши Views
urlpatterns = [
# Главная страница (список постов)
path('', PostListView.as_view(), name='post-list'),
# Страница одного поста
# <int:pk> - это "захват" части URL. Django возьмет число из URL,
# назовет его 'pk' (Primary Key) и передаст в DetailView.
path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
]
● Что изучает студент:
○ Вы создали URL-маршруты для своего приложения.
○ path(): Функция, связывающая URL-путь с View.
○ .as_view(): Метод для превращения Class-Based View в обычную
функцию-представление.
○ <int:pk>: Вы научились создавать динамические URL. Теперь
/post/1/, /post/5/ и /post/42/ будут обрабатываться одним
представлением (PostDetailView).
○ name='...': Вы дали "имя" каждому URL. Это очень важно для
использования в шаблонах!
Шаг 7: Шаблоны (Templates)
Шаблоны — это HTML-файлы с "дырками", куда Django вставляет данные из
Views.
1. Создайте папки. По-умолчанию, Django ищет шаблоны в папке
templates внутри каждого приложения.
○ Внутри C:\django\posts\ создайте папку templates.
○ Внутри C:\django\posts\templates\ создайте еще одну папку posts.
2. Структура должна быть такой:
C:\django\posts\
templates\
posts\
post_list.html
post_detail.html
3. (Эта вложенность posts/templates/posts/ называется "namespacing" и
нужна, чтобы шаблоны с одинаковыми именами из разных приложений
не конфликтовали).
4. Создайте post_list.html (Список постов):
5. HTML
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Мой Блог</title>
<style> body { font-family: sans-serif; max-width: 800px; margin: auto; padding:
20px; } </style>
</head>
<body>
<h1>Добро пожаловать в мой блог!</h1>
<hr>
{% for post in posts %}
<article>
<h2>
<a href="{% url 'post-detail' [Link] %}">{{ [Link] }}</a>
</h2>
<p><i>Опубликовано: {{ post.pub_date }}</i></p>
<p>{{ [Link]|truncatewords:30 }}</p> </article>
<hr>
{% endfor %}
</body>
</html>
Создайте post_detail.html (Один пост):
HTML
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>{{ [Link] }}</title>
<style> body { font-family: sans-serif; max-width: 800px; margin: auto; padding:
20px; } </style>
</head>
<body>
<h1>{{ [Link] }}</h1>
<p><i>Опубликовано: {{ post.pub_date }}</i></p>
<hr>
<div>
{{ [Link]|linebreaks }}
</div>
<hr>
<a href="{% url 'post-list' %}"> ← Назад ко всем постам</a>
</body>
</html>
● Что изучает студент:
○ {{ [Link] }}: Переменные. Django подставляет сюда значения из
объекта post.
○ {% for post in posts %} ... {% endfor %}: Теги (Циклы). Вы
перебираете список posts, который пришел из PostListView.
○ {% url 'post-detail' [Link] %}: Теги (URL). Вы создаете
динамическую ссылку, не прописывая URL вручную (т.е. не
href="/post/{{ [Link] }}/"). Это правильный способ.
○ |linebreaks, |truncatewords:30: Фильтры. Это простые способы
форматировать данные прямо в шаблоне.
Шаг 8: Запуск и Проверка
Убедитесь, что вы (или создали в админке) хотя бы 1-2 поста.
1. Запустите сервер (если он еще не запущен):
2. Bash
python [Link] runserver
3. Откройте [Link]
○ Вы должны увидеть свой post_list.html со списком постов.
4. Нажмите на заголовок любого поста.
○ Вас должно перекинуть на [Link] (или /post/2/
и т.д.).
○ Вы должны увидеть post_detail.html с полным текстом этого поста.
5. Нажмите "Назад ко всем постам".
○ Вы должны вернуться на главную.
Шаг 9: Добавляем Категории
1. Модель (posts/[Link]):
Добавьте перед классом Post новую модель Category. Затем добавьте
поле category в модель Post.
2. Python
# C:\django\posts\[Link]
# ... (импорты) ...
class Category([Link]):
name = [Link](max_length=100, verbose_name="Название
категории")
def __str__(self):
return [Link]
class Meta:
verbose_name = "Категория"
verbose_name_plural = "Категории"
class Post([Link]):
title = [Link](max_length=200, verbose_name="Заголовок")
content = [Link](verbose_name="Содержимое")
pub_date = [Link](auto_now_add=True, verbose_name="Дата
публикации")
# НОВОЕ ПОЛЕ
category = [Link](
Category,
on_delete=models.SET_NULL, # Если удалить категорию, посты не
удалятся
null=True, # Разрешаем полю быть пустым в БД
blank=True, # Разрешаем полю быть пустым в админке
verbose_name="Категория"
)
# ... (остальной код Post) ...
Миграции:
Bash
python [Link] makemigrations posts
python [Link] migrate
Админка (posts/[Link]):
Зарегистрируйте новую модель.
Python
# C:\django\posts\[Link]
from [Link] import admin
from .models import Post, Category # <-- Добавляем Category
[Link](Post)
[Link](Category) # <-- Регистрируем Category
Шаблоны (post_detail.html):
Выведем категорию на странице поста, если она есть.
Добавьте этот блок после даты в post_detail.html:
HTML
...
<h1>{{ [Link] }}</h1>
<p><i>Опубликовано: {{ post.pub_date }}</i></p>
{% if [Link] %}
<p><strong>Категория: {{ [Link] }}</strong></p>
{% endif %}
<hr>
...
○ Что изучает студент: Вы создали связь ForeignKey (Многие-к-
Одному), разобрались с on_delete и научились использовать тег
{% if %} в шаблонах.
Теперь в админке вы можете сначала создать категории, а затем при
редактировании поста выбирать их из выпадающего списка.
Проект Django: Пошаговое руководство по созданию блога
Папка проекта: C:\django
Название проекта: Blog
---
## Шаг 1: Настройка проекта и виртуальной среды
1. **Откройте командную строку (CMD или PowerShell).**
2. **Перейдите в вашу рабочую папку:**
cd C:\django
3. **Создайте виртуальную среду (venv):**
python -m venv venv
4. **Активируйте ее:**
venv\Scripts\activate
(Ваша командная строка теперь должна начинаться с (venv))
5. **Установите Django:**
pip install django
6. **Создайте проект `Blog` (точка `.` в конце важна):**
django-admin startproject Blog .
7. **Создайте приложение (app) `posts`:**
python [Link] startapp posts
8. **Зарегистрируйте приложение в проекте.** Откройте файл `C:\django\Blog\
[Link]`.
Найдите `INSTALLED_APPS` и добавьте `'posts'`.
INSTALLED_APPS = [
# ... (другие приложения) ...
'[Link]',
'posts', # <-- ДОБАВЬТЕ ЭТУ СТРОКУ
]
---
## Шаг 2: Создание моделей (Models)
Модель — это Python-класс, который описывает таблицу в базе данных.
1. Откройте файл `C:\django\posts\[Link]`.
2. Вставьте этот код:
from [Link] import models
class Post([Link]):
title = [Link](max_length=200, verbose_name="Заголовок")
content = [Link](verbose_name="Содержимое")
pub_date = [Link](auto_now_add=True, verbose_name="Дата
публикации")
def __str__(self):
return [Link]
class Meta:
verbose_name = "Пост"
verbose_name_plural = "Посты"
ordering = ['-pub_date'] # Сортировка (новые сверху)
---
## Шаг 3: Миграции базы данных
Вы описали модели, теперь нужно применить их к базе данных.
1. **Создайте файл миграции:**
python [Link] makemigrations posts
2. **Примените миграцию к базе:**
python [Link] migrate
---
## Шаг 4: Админ-панель (Admin)
1. **Создайте супер-пользователя (администратора):**
python [Link] createsuperuser
(Введите логин, email и пароль)
2. **Зарегистрируйте модель в админке.** Откройте `C:\django\posts\[Link]` и
вставьте:
from [Link] import admin
from .models import Post # Импортируем нашу модель
[Link](Post) # Регистрируем ее
3. **Проверьте!** Запустите сервер:
python [Link] runserver
4. Откройте в браузере `[Link]
5. Войдите и **создайте 2-3 тестовых поста**.
---
## Шаг 5: Представления (Views)
View решает, *какие* данные и *как* показать пользователю.
1. Откройте `C:\django\posts\[Link]`.
2. Вставьте этот код (используем Class-Based Views):
from [Link] import ListView, DetailView
from .models import Post
class PostListView(ListView):
model = Post
template_name = 'posts/post_list.html' # Шаблон списка постов
context_object_name = 'posts' # Имя переменной в шаблоне
class PostDetailView(DetailView):
model = Post
template_name = 'posts/post_detail.html' # Шаблон одного поста
context_object_name = 'post' # Имя переменной в шаблоне
---
## Шаг 6: Маршруты (URLs)
URLs — это "диспетчер", который связывает URL-адрес с вашим View.
1. **Главный `[Link]` (Проекта)**
Откройте `C:\django\Blog\[Link]`. Подключите URL-адреса приложения
`posts`.
from [Link] import admin
from [Link] import path, include # <-- Убедитесь, что 'include' есть
urlpatterns = [
path('admin/', [Link]),
path('', include('[Link]')), # <-- ДОБАВЬТЕ ЭТУ СТРОКУ
]
2. **`[Link]` (Приложения)**
**Создайте** новый файл `C:\django\posts\[Link]`.
Вставьте в него код:
from [Link] import path
from .views import PostListView, PostDetailView # Импортируем наши Views
urlpatterns = [
# Главная страница (список постов)
path('', PostListView.as_view(), name='post-list'),
# Страница одного поста (например, /post/1/)
path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
]
---
## Шаг 7: Шаблоны (Templates)
Шаблоны — это HTML-файлы с "дырками" для данных.
1. **Создайте папки** для шаблонов:
* Внутри `C:\django\posts\` создайте папку `templates`.
* Внутри `C:\django\posts\templates\` создайте папку `posts`.
Структура: `C:\django\posts\templates\posts\`
2. **Создайте `post_list.html`:**
Создайте файл `C:\django\posts\templates\posts\post_list.html`
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Мой Блог</title>
<style> body { font-family: sans-serif; max-width: 800px; margin: auto; padding:
20px; } </style>
</head>
<body>
<h1>Добро пожаловать в мой блог!</h1>
<hr>
{% for post in posts %}
<article>
<h2>
<a href="{% url 'post-detail' [Link] %}">{{ [Link] }}</a>
</h2>
<p><i>Опубликовано: {{ post.pub_date }}</i></p>
<p>{{ [Link]|truncatewords:30 }}</p> </article>
<hr>
{% endfor %}
</body>
</html>
3. **Создайте `post_detail.html`:**
Создайте файл `C:\django\posts\templates\posts\post_detail.html`
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>{{ [Link] }}</title>
<style> body { font-family: sans-serif; max-width: 800px; margin: auto; padding:
20px; } </style>
</head>
<body>
<h1>{{ [Link] }}</h1>
<p><i>Опубликовано: {{ post.pub_date }}</i></p>
<hr>
<div>
{{ [Link]|linebreaks }}
</div>
<hr>
<a href="{% url 'post-list' %}"> ← Назад ко всем постам</a>
</body>
</html>
---
## Шаг 8: Запуск и Проверка
1. Убедитесь, что вы создали 1-2 поста в админке (`/admin/`).
2. Запустите сервер:
python [Link] runserver
3. Откройте `[Link] Вы должны увидеть список постов.
4. Нажмите на заголовок. Вы должны перейти на страницу поста (например,
`/post/1/`).
---
## (Опционально) Шаг 9: Добавляем Категории
1. **Модель (`posts/[Link]`)**:
Добавьте класс `Category` (ПЕРЕД `Post`) и добавьте поле `category` в `Post`.
...
class Category([Link]):
name = [Link](max_length=100, verbose_name="Название
категории")
def __str__(self):
return [Link]
class Meta:
verbose_name = "Категория"
verbose_name_plural = "Категории"
class Post([Link]):
title = [Link](max_length=200, verbose_name="Заголовок")
content = [Link](verbose_name="Содержимое")
pub_date = [Link](auto_now_add=True, verbose_name="Дата
публикации")
# НОВОЕ ПОЛЕ
category = [Link](
Category,
on_delete=models.SET_NULL, # Если удалить категорию, посты не
удалятся
null=True, # Разрешаем полю быть пустым
blank=True,
verbose_name="Категория"
)
...
2. **Миграции**:
python [Link] makemigrations posts
python [Link] migrate
3. **Админка (`posts/[Link]`)**:
Зарегистрируйте `Category`.
from [Link] import admin
from .models import Post, Category # <-- Добавляем Category
[Link](Post)
[Link](Category) # <-- Регистрируем Category
4. **Шаблоны (`post_detail.html`)**:
Отобразим категорию (вставьте это после даты):
...
<p><i>Опубликовано: {{ post.pub_date }}</i></p>
{% if [Link] %}
<p><strong>Категория: {{ [Link] }}</strong></p>
{% endif %}
<hr>
...