Создание сайта на Django: Урок 6, вывод списка статей на сайте, подключение шаблонов
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Руководства «Django»
Комментариев: 2

Я как и в прошлом уроке, создам папку views с файлом __init__.py, разделяя представления по отдельности. Потому что мне так удобно. Вы можете все оставить в одном файле.

Выглядеть это будет так:

  • blog
    • views
      • __init__.py
      • articles.py

Следующее, что мы должны сделать, это создать папку 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/, и видим следующее:

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

Надеюсь, я объясняю доходчиво и самым простым языком.

Комментарии к статье 2
  • Xemordio
    20 августа 2022 г. 9:38

    Годные уроки, очень полезно

    • Razilator
      20 августа 2022 г. 11:17

      Xemordio, благодарю, рад, что вам нравится!

Форма добавления комментария (необходима регистрация)