ZANIN блог
Контакты
Крути вниз
Фильтр по:
//Post title

Разработка сайта на Django - урок 06 - создание блога

25 Ноя 2020Категория : Django

Разработка сайта на Django - урок 06 - создание блога

Продолжим разработку сайта на Django и в этом уроке реализуем функционал блога. Шаблон для блога у меня уже есть, поэтому сначала подключим его и посмотрим, какой функционал потребуется именно для шаблона.

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

python manage.py startapp blog

Получаем результат:

Создание блога на Django в PyCharm - урок 6

Далее подключаем созданное приложение в файле settings.py в папке проекта booktime

Создание блога на Django в PyCharm - урок 6

В директории INSTALLED_APPS добавляем строку:

Создание блога на Django в PyCharm - урок 6

Теперь переходим в файл urls.py в папке нашего проекта

Создание блога на Django в PyCharm - урок 6

Добавляем строку.

Создание блога на Django в PyCharm - урок 6

В папке templates создаем папку blog и в ней blog.html, в котором html шаблон страницы.

Создание блога на Django в PyCharm - урок 6

Таким способом мы адрес /blog/ по которому будет открываться наш шаблон. Сейчас шаблон подгружается за счет класса TemplateView, так быстрее можно подключить шаблон и работать с ним. Правда сейчас результат следующий:

Создание блога на Django в PyCharm - урок 6

Подключенный шаблон пока не имеет стилей, поэтому делаем следующее.

Создание блога на Django в PyCharm - урок 6

Стили подключились, но медиафайлы необходимо прописывать руками.

Создание блога на Django в PyCharm - урок 6

Эта страница на которой выводятся все записи блога. Для этой страницы нам необходимо продумать реализацию следующих элементов: Title, Description, заголовок H1. Создадим модель для этой страницы.

 

Создание блога на Django в PyCharm - урок 6

Выполняем команды:

python manage.py makemigrations blog

Создание блога на Django в PyCharm - урок 6

Если ошибок не выскочило, то выполняем миграцию.

python manage.py migrate blog

Создание блога на Django в PyCharm - урок 6

Далее, чтобы модель появилась в админке заходим в файл admin.py в нашем приложении blog и добавляем следующее.

Создание блога на Django в PyCharm - урок 6

До этого я приводил пример добавления модели в админку при помощи декораторов, а сейчас привел второй вариант. Также зайдем в файл apps.py в приложении blog и добавим там строку.

Создание блога на Django в PyCharm - урок 6

Теперь в админке должно быть так:

Создание блога на Django в PyCharm - урок 6

Теперь настроим ссылку на страницу блога. В приложении blog создаем файл urls.py

Создание блога на Django в PyCharm - урок 6

В файл пока добавляем такие строки. После этого нам надо в файле views.py в приложении blog необходимо написать функционал, который будет вызываться и отдавать данные при заходе на адрес domain/blog/

Создание блога на Django в PyCharm - урок 6

Работает это так:

При заходе на сайт по адресу /blog/ мы сначала обращаемся к файлу urls.py в папке нашего проекта (там где лежит файл settings.py).

Создание блога на Django в PyCharm - урок 6

В файле urls.py происходит сравнение пути, к которому обращаются с url запроса.

Создание блога на Django в PyCharm - урок 6

Когда /blog/ в запросе совпадает с blog/ в файле urls.py, то инклудится приложение blog. И из приложения blog инклудится файл urls.py - за это отвечает include('blog.urls', namespace='blog'). Поскольку после /blog/ больше никаких параметров не передается, срабатывает строка, в которой пустое значение пути.

 

Создание блога на Django в PyCharm - урок 6

После этого должна вызваться функция или класс, которые отдадут данные в шаблон, который загрузиться при обращении по этому адресу.

Переходим в файл views.py в приложении blog.

Создание блога на Django в PyCharm - урок 6

В файле views.py мы можем написать контроллер-функцию или контроллер-класс.

 

Сначала приведу пример с использованием контроллер-функции

Создаем функцию с именем posts, которая принимает аргумент request. Фактически аргумент request - это экземпляр класса HttpRequest, который традиционно называется request и хранит в себе сведения о полученном клиентском запросе. Далее можно передавать именованные параметры, которые совпадают с именами URL-параметров, которые прописаны в файле urls.py.

Создание блога на Django в PyCharm - урок 6

Сама функция должна возвращать экземпляр класса HttpResponse render, дальше передается путь к шаблону и переменные, которые необходимо вывести в шаблоне.

Сейчас подключим в файле urls.py приложения blog нашу созданную функцию posts.

Создание блога на Django в PyCharm - урок 6

В некоторых примерах вы можете встретить то, что подключают контроллер-функцию from blog import views. Тогда вам придется в строке маршрута писать так: path('', views.posts, name='posts')

Что же означают значения app_name и name? Эти псевдонимы используются потом в шаблонах. Например, вам необходимо поставить ссылку на блог в шаблоне, тогда при наличии таких имен у вас ссылка будет такого вида: blog:posts. Подробнее покажу позже в статье.

После подключения нашей функции posts шаблон отображается по адресу /blog/

Создание блога на Django в PyCharm - урок 6

Далее надо вывести данные из базы данных в шаблон. У нас пока написана одна модель для блога, то начнем с нее. В файле views.py приложения блог мы дописываем 2 строки:

seodata = BlogPage.objects.all()

context = {'seodata': seodata, }

Создание блога на Django в PyCharm - урок 6

В строке seodata = BlogPage.objects.all() - переменная seodata получает объект модели BlogPage. Вместо all() в данном случае можно использовать first(), так как у этой модели в таблице будет всего одна запись.

Создание блога на Django в PyCharm - урок 6

В строке context = {'seodata': seodata, } мы создаем словарь, который называют контекстом шаблона. Ключу 'seodata' мы передаем значение переменной seodata, а в шаблоне уже вызываем ключ этого словаря. Поэтому вы можете называть ключ, как хотите, но все-таки понятнее, если имя будет такое же. Дальше в строке return render(request, 'blog/blog.html', context) мы передаем этот словарь, чтобы использовать его ключи в шаблоне.

Однако, мы можем использовать второй способ - это не создавать словарь context, а сразу в строке return render(request, 'blog/blog.html', {'seodata': seodata, }) сделать так.

Сейчас выведем данные в шаблон. Так как, эти данные - мета-теги для seo, то это очень интересный момент, потому что мало в каких статьях этому уделяют внимание.

Выводим мета-теги title и description в Django

Сейчас у нас реализована главная страница и страница блога со всеми статьями. Это 2 шаблона: для главной страницы шаблон main.html, а для страницы блога blog.html. Общее у этих двух шаблонов то, что есть base.html, который включает в себя header и footer, а там где header, там и head с мета-тегами и подключаемыми стилями.

Так как в файле views.py приложения blog я привел два варианта получения объекта seodata из модели BlogPage, то и в шаблоне необходимо привести пример двух вариантов. Когда мы получаем все объекты с помощью метода all() (seodata = BlogPage.objects.all()), то объект seodata итерируемый. Сейчас поясню подробнее.

Заходим в файл base.html и добавляем туда следующие строки:

Создание блога на Django в PyCharm - урок 6

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

{% block content %}

{% endblock content %}

Блок с именем content в шаблоне base.html принимает в себя данные из других шаблонов. Эти данные в других шаблонах обернуты в такую конструкцию:

{% block content %}

... данные ...

{% endblock content %}

Точно также у нас создаются блоки title и description:

{% block title %}Главная страница{% endblock %}

{% block META_description %}Мета-описание главной страницы{% endblock %}

Если данные в этот блок не прилетают, то в title попадет - "Главная страница", а в description - "Мета-описание главной страницы".

Теперь заходим в шаблон blog.html и добавляем в шаблон следующее:

Создание блога на Django в PyCharm - урок 6

Так как seodata у нас итерируемый объект, то получить из него данные можно в цикле. Но если получить объект не методом all(), а например методом first(), то цикл не нужен (главное, чтобы в таблице была одна запись).

Теперь можно проверить работу наших мета-тегов title и description.

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

Для категории нам необходимо создать модель. Наши категории могут быть родительскими и дочерними, но сколько может быть дочерних? Этот вопрос для того, что я часто встречаю, что некоторые создают категории "Модель родительской категории", "модель дочерней категории". Такой подход можно найти много в каких статьях, но если иерархия вложенности может быть больше, тогда создавать под каждый уровень свою модель - очень не хочется. В этом случае правильнее использовать подход, при котором модель может ссылаться сама на себя. На самом деле у django есть специальная библиотека для этого, но мы используем функционал моделей Django.

В файле models.py приложения blog мы создаем такую модель.

Создание блога на Django в PyCharm - урок 6

Основное внимание на эту строку:

category = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE, related_name='children')

Таким способом мы можем создавать иерархию вложенности с помощью одной модели.

Далее не забываем следующие команды:

python manage.py makemigrations blog

python manage.py migrate blog

Теперь заходим в файл admin.py приложения blog и дописываем туда следующее:

Создание блога на Django в PyCharm - урок 6

Теперь мы можем зайти в админку, и создать основную категорию:

Создание блога на Django в PyCharm - урок 6

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

Создание блога на Django в PyCharm - урок 6

Если интересно, то записи об этих категориях в таблице выглядят так:

Создание блога на Django в PyCharm - урок 6

Однако, у категорий нет slug, чтобы переходить по нему в нужную категорию. Добавим в модель категории slug

Создание блога на Django в PyCharm - урок 6

Поле slug лучше делать уникальным, но у нас уже были заполнены другие поля, и если мы поставим unique=True, то при проведении миграции будет ошибка, так как для новых полей необходимо вставить какое-то дефолтное значение, а оно не может быть одинаковым. Поэтому сначала ставим blank=True, а затем выполняем команды makemigrations и migrate. Иногда при команде makemigrations выскакивает предупреждение, что для новых столбцов в таблице необходимо установить дефолтное значение и необходимо выбрать одно из двух сообщений (1 или 2), а дальше ввести дефолтное значение.

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

Создание блога на Django в PyCharm - урок 6

После этого в модели категории slug делаем уникальным и снова выполняем команды makemigrations и migrate.

Создание блога на Django в PyCharm - урок 6

Теперь переходим в файл views.py приложения blog и дописываем в него небольшой функционал, чтобы получать для категории и подкатегории title и description.

Создание блога на Django в PyCharm - урок 6

Наша функция posts теперь принимает два параметра: category_slug и subcategory_slug. Этим параметрам я присвоил None по умолчанию, если они вдруг пустые. Например, когда попадаем просто на страницу блога со всеми статьями, без выбора категорий.

Дальше я объявляю две переменные category и subcategory в значениях None. После этого в условии if category_slug: проверяю, есть ли в запросе slug категории или нет. Если slug категории передан в запросе, то переменная category получает объект категории из модели CategoryBlog. Метод get_object_or_404 получает из модели запись, которая соответствует условию переданных параметров. В данном случае у модели CategoryBlog идет поиск по slug. В slug прилетает значение из category_slug. В данном случае это соответствует SQL запросу:

SELECT * FROM blog_categoryblog WHERE slug = 'category';

get_object_or_404("Источник, где искать", "Условие поиска") - возвращает только одну запись или вызывает исключение Http404. В случае, если по критериям поиска найдено несколько записей, будет вызвано исключение MultipleObjectsReturned. Для получения списка записей можно использовать метод get_list_or_404.

Теперь перейдем в файл urls.py приложения blog и создадим маршруты, по которым будут работать наши категории и вызываться функция posts.

Создание блога на Django в PyCharm - урок 6

Теперь можно проверить результаты:

category

Создание блога на Django в PyCharm - урок 6

sub-category

Создание блога на Django в PyCharm - урок 6

В python нет var_dump, как в PHP, поэтому можно посмотреть, что прилетает в переменную при помощи print.

Создание блога на Django в PyCharm - урок 6

Вот что выводиться в консоль при запросе:

Создание блога на Django в PyCharm - урок 6

Теперь выведем в шаблон title и description

как прописать title и description в django

Тут выполняются несколько условий. Если в подкатегории (subcategory) значение title не пустое, тогда в title выводится это значение, иначе проверяется title для категории и если его нет, тогда выводится title для страницы Блог. Тоже самое и для description. Также можно реализовывать шаблонное заполнение тегов, что иногда нужно на больших сайтах.

Создание блога на Django в PyCharm - урок 6

Создание блога на Django в PyCharm - урок 6

Теперь выведем заголовки и описания в этот блок и перейдем к созданию статей.

Создание блога на Django в PyCharm - урок 6

Сейчас этот блок такой:

Создание блога на Django в PyCharm - урок 6

Делаем так:

Создание блога на Django в PyCharm - урок 6

Получаем так:

Создание блога на Django в PyCharm - урок 6

Еще реализуем хлебные крошки:

Создание блога на Django в PyCharm - урок 6

Результат следующий:

Создание блога на Django в PyCharm - урок 6

Создание блога на Django в PyCharm - урок 6

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

  • 687

01. Об авторе

Александр Занин

Занимаюсь разработкой на Django,
а также бэкенд разработкой на PHP (Laravel, Slim).

Find on :

02. Свежие статьи

Готовы заказать проект?

© ZANIN 2019 / All rights reserved.
Контакты
Close