Я как и в прошлом уроке, создам папку views с файлом __init__.py, разделяя представления по отдельности. Потому что мне так удобно. Вы можете все оставить в одном файле.
Выглядеть это будет так:
- blog
- views
- __init__.py
- articles.py
- views
Следующее, что мы должны сделать, это создать папку templates, включить ее в settings.py, настроить urls.py и т.д. Давайте начнем.
Создание папки шаблона в Django, добавление в settings.py
В корне нашего проекта создаем папку templates. Выглядеть это должно следующим образом.

Добавление обработки папки templates. Заходим в settings.py, находим следующее:
backend/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': '',
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
И где написано DIRS, добавляем значение [BASE_DIR / 'templates'].
backend/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Пояснения:
- BASE_DIR - это папка нашего проекта.
- templates - это папка с нашим будущим шаблоном, куда мы будем выводить контент.
С этим разобрались. Давайте теперь создадим в папке templates саму домашнюю страницу, и страницу для вывода статей.
Создание HTML страничек внутри templates
Я создаю main.html, это главная страничка. P.S. Это все я взял из движка DLE на PHP ещё в далеком 2015 году))) Поэтому я придерживаюсь такого стиля.
И так, контент простенький, он даже сам создастся, если вы все таки используете PyCharm.
templates/main.html
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Заголовок</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
Пояснение за main.html:
- {% block content %} отвечает за вывод определенного контента, когда мы наследуем главную страницу в других шаблонах с помощью {% extends '' %}, и всегда нужно закрывать шаблонные теги Django {% endblock %}
Также я создаю следующую уже похожую структуру для своего удобства для статей.
- modules/blog/articles/articles-list.html
С следующим содержимым:
templates/modules/blog/articles/article-list.html
{% extends 'main.html' %}
{% block content %}
{% for article in articles %}
<strong>{{ article.title }}</strong>
<p>{{ article.short_description }}</p>
{% endfor %}
{% endblock %}
Пояснения за articles-list.html
- extends - наследуемся от главной страницы, чтоб мы могли вставить контент в определенное место в шаблоне нашего сайта.
- for это цикл, благодаря которому мы проходимся по базе данных и выводим список статей из articles. articles - это переменная содержащая в себе queryset с нашими статьями, ее мы зададим во views. Я просто заранее оформил как нам необходимо. Цикл обязательно закрывать тегом {% endfor %}
- {{ article.title }} - это вывод заголовка. Article - это единичный объект, поэтому мы можем вызывать все необходимые поля из нашей модели таким образом.
- {{ article.short_description }} тоже самое, что и выше.
Переходим к представлениям Django!
Кстати, структура получилась вот такая:

Представления Django на основе функций и классов
И так, у нас есть два вида представлений. На основе функций и на основе классов. В этом примере я покажу два примера, но использовать везде я буду всегда представления на основе классов.
Заходим во views.py, либо же как у меня на скриншоте выше, в views/articles.py, и добавляем следующий контент:
modules/blog/views/articles.py
from django.shortcuts import render
from modules.blog.models import Article
def article_list(request):
articles = Article.objects.all()
return render(request, 'modules/blog/articles/article-list.html', {'articles': articles})
Пояснения:
- def - функция с название article_list, принимающая запрос (request).
- articles - та самая переменная, в которой обрабатывается queryset. Что такое queryset? - QuerySet - это итерируемый объект, означающий, что он содержит несколько объектов, которые мы можем перебирать / прокручивать.
- return render(запрос, шаблон, контекст передаваемый в шаблон), здесь мы рендерим с помощью нашего запроса определенный контекст (статьи) в нашем заданном шаблоне.
Но это не все, нам нужно подключить новый файл внутри нашего модуля "Блог". Создадим файл urls.py.
В него впишем следующее содержимое:
modules/blog/urls.py
from django.urls import path
from modules.blog.views import article_list
urlpatterns = [
path('', article_list, name='article-list'),
]
В этом файле мы подключаем наше представление и указываем обрабатываемую ссылку. В нашем случае это главная страница.
Но! Мы должны подключить наш urls.py в главном файле urls.py, который находится в папке backend рядом с settings.py
В этом файле видим следующее содержимое:
backend/urls.py
"""backend URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
И добавляем импорт include и инклюдим наш urls.py из модуля блог.
Получиться должно вот так:
backend/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('modules.blog.urls')),
]
Отлично. Теперь давайте добавим нашу первую статью через админку и посмотрим результат.

Добавляем, и переходим на главную страничку http://127.0.0.1:8000/, и видим следующее:

Если получилось все так, значит вы сделали все правильно. В следующем уроке я вам покажу представление на основе классов, они намного удобнее и более расширяемые.
Надеюсь, я объясняю доходчиво и самым простым языком.
Xemordio
Годные уроки, очень полезно
Razilator
Xemordio, благодарю, рад, что вам нравится!