Создание приложения для блога с помощью Django

Описание руководства
В руководстве описана пошаговая инструкция создания блога с помощью Django, которое позволяет пользователям создавать, редактировать и удалять сообщения.

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

Цель этого руководства — предоставить общее представление о работе Django.



Django
— это веб-фреймворк с открытым исходным кодом, написанный на Python, который следует архитектурному шаблону MVP (модель-представление-шаблон).

Django делает путь от разработки до развертывания достаточно простым. Django оснащен множеством встроенных функций и оказался чрезвычайно масштабируемым для обработки большого трафика в реальном времени, некоторые из самых популярных сайтов, созданных на основе Django, — это Instagram, Pinterest, Bitbucket, Disqus, Mozilla.
Установка Django в виртуальной среде
Перед началом работы необходимо создать виртуальное окружение и установить необходимые пакеты для Django.
В данном руководстве не рассматривается создание и настройка виртуального окружения.
Командная строка

# Создание виртуального окружения
python -m venv venv  

# Запуск виртуального окружения
venv/Scripts/activate 

# Установка Django
pip install django
Создание структуры проекта
Теперь запустите следующую команду в своей оболочке, чтобы создать проект Django. Это создаст структуру проекта с несколькими каталогами и скриптами Python.

├── mysite
--- __init__.py
---settings.py
---urls.py
---wsgi.py

-manage.py

django-admin startproject myblog
Создание приложения
Далее нам нужно создать приложение Django под названием backend. Приложение Django существует для выполнения конкретной задачи. Вам необходимо создать определенные приложения, которые отвечают за предоставление желаемых функций вашего сайта.

Перейдите во внешний каталог, где manage.pyсуществует сценарий, и выполните приведенную ниже команду.


python manage.py startapp backend
Регистрация приложения
Теперь нам нужно сообщить Django, что новое приложение было создано, откройте ваш settings.py файл и прокрутите до раздела установленных приложений, в котором должны быть уже установленные приложения.

Теперь добавьте только что созданное приложение внизу и сохраните его.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'backend',
]
тестовый запус
Далее выполните миграции.

Проверим конфигурацию, запустив встроенный сервер разработки Django.

После выполнения команд.
Откройте браузер и перейдите по этому адресу http://127.0.0.1:8000/, если все прошло хорошо, вы должны увидеть эту страницу.
командная строка

python manage.py migrate

python manage.py runserver
Модели баз данных
Определим первоначальные модели данных для нашего блога.

Модель — это класс Python , который является подклассом django.db.models.Model, в котором каждый атрибут представляет поле базы данных. Используя эту функциональность подкласса, мы автоматически получаем доступ ко всему в django.db.models.Models и можем добавлять дополнительные поля и методы по желанию. У нас будет модель Post в нашей базе данных для хранения сообщений.
файл models.py

from django.db import models
from django.contrib.auth.models import User


STATUS = (
    (0,"Draft"),
    (1,"Publish")
)

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
    updated_on = models.DateTimeField(auto_now= True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title
Описание модели
Импортируем класс, models, затем создаем подкласс. models.Model. Как и в любом типичном блоге, каждая запись в блоге будет иметь:

  • title - заголовок,
  • slug - адрес страницы,
  • author - имя автора
  • updated_on - дата публикации
  • content - содержание
  • created_on - последнего обновления статьи.
  • status - статус статьи (опубликовано или нет)

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

Класс Meta внутри модели содержит метаданные. Описано, сортировать результаты в created_on поле по убыванию по умолчанию, когда мы запрашиваем базу данных. Сообщения, опубликованные недавно, будут отображаться первыми.

Метод __str__() является удобочитаемым представлением объекта по умолчанию. Django будет использовать его во многих местах, например, на сайте администрирования.

Теперь, когда наша новая модель базы данных создана, нам нужно создать для нее новую запись миграции и перенести изменения в нашу базу данных.

Ctrl+C - остановка сервера

Командная строка

python manage.py makemigrations
python manage.py migrate
Создание раздела администрирования
Создадим панель администратора для создания и управления сообщениями. Django поставляется со встроенным интерфейсом администратора для таких задач.

Нам нужно создать суперпользователя.

Будет предложено ввести адрес электронной почты, пароль и имя пользователя. Обратите внимание, что из соображений безопасности пароль не будет виден.
Командная строка

python manage.py createsuperuser
Панель администрирования
Перезапустите сервер разработки (python manage.py runserver) и перейдите по адресу http://127.0.0.1:8000/admin/.


Вы должны увидеть страницу входа, введите данные, которые вы предоставили для суперпользователя.
Добавление моделей на сайт администрирования
Откройте admin.py файл и зарегистрируйте там модель Post следующим образом.

Сохраните файл и обновите страницу, вы должны увидеть там модель Posts.

Теперь давайте создадим нашу первую публикацию в блоге. Нажмите значок «Добавить» рядом с записью, чтобы перейти на другую страницу, где вы можете создать запись. Заполните соответствующие формы и создайте свой первый пост.
admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)
Изменение админки
Настроим способ отображения данных в панели администрирования в соответствии с нашим удобством.

list_display - отображает свойства, упомянутые в кортеже, в списке сообщений для каждого сообщения.

Справа, есть фильтр, который фильтрует сообщения в зависимости от их статуса. Полем list_filter указываются поля фильтрации.

Панель поиска вверху списка, которая будет искать базу данных по search_fields атрибутам. Последний атрибут prepopulated_fields заполняет поле slug, url будет автоматически заполняться на основе вашего заголовка.

Теперь, когда наша модель базы данных завершена, нам нужно создать необходимые представления, URL-адреса и шаблоны, чтобы мы могли отображать информацию в нашем веб-приложении.

admin.py

from django.contrib import admin
from .models import Post

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug', 'status','created_on')
    list_filter = ("status",)
    search_fields = ['title', 'content']
    prepopulated_fields = {'slug': ('title',)}

admin.site.register(Post, PostAdmin)
вНЕСЕНИЕ ТЕСТОВЫХ ДАННЫХ
Зайдите в админку и внесите несколько постов для тестирования функционала платформы.
Создание Views
View — это просто функция Python , которая получает веб-запрос и возвращает веб-ответ. Мы будем использовать представления на основе классов, затем сопоставим URL-адреса для каждого представления и создадим HTML-шаблон для данных, возвращаемых из представлений.

Откройте views.py

views.py

from django.contrib import admin
from .models import Post

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug', 'status','created_on')
    list_filter = ("status",)
    search_fields = ['title', 'content']
    prepopulated_fields = {'slug': ('title',)}

admin.site.register(Post, PostAdmin)
Описание
Встроенные класс ListViews, являются подклассом общих представлений на основе классов, отображают список с объектами указанной модели. DetailView предоставляет подробный вид для данного объекта модели в предоставленном шаблон.

Обратите внимание, что для PostList просмотра мы применили фильтр, чтобы отображалась только запись со статусом публикации. Также упорядочили все посты по дате их создания. Знак (-) перед created_on означает, что последний пост будет вверху.

добавление URL адресов
Необходимо сопоставить URL-адрес для представлений, которые мы сделали выше. Когда пользователь делает запрос на страницу в вашем веб-приложении, контроллер Django берет на себя поиск соответствующего представления через urls.py файл, а затем возвращает ответ HTML или ошибку 404, если адрес не найден.

Создайте urls.py файл в каталоге приложения вашего блога и добавьте следующий код.
urls.py

from . import views
from django.urls import path

urlpatterns = [
    path('', views.PostList.as_view(), name='home'),
    path('<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
]
описание
Мы сопоставили шаблоны URL для наших View, используя функцию пути. Первый шаблон принимает пустую строку, обозначенную пустой строкой и возвращает результат, сгенерированный из PostList представления, которое по сути является списком сообщений для нашей домашней страницы, также есть имя параметра, которое в основном является именем представления, которое будет использоваться в шаблоны.

Имена являются необязательным параметром, но рекомендуется давать уникальные и запоминающиеся имена представлениям, что упрощает нашу работу при разработке шаблонов и помогает поддерживать порядок по мере роста количества URL-адресов.

Затем у нас есть обобщенное выражение для PostDetail представлений, которые разрешают slug (строку, состоящую из букв или цифр ASCII). Django использует угловые скобки < > для захвата значений из URL-адреса и возврата эквивалентной страницы сведений о сообщении.

Теперь нам нужно включить эти URL-адреса блога в реальный проект, откройте основной myblog\urls.py файл сайта.
myblog/urls.py

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

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