From b522d9c9de20107f35c3a4130a5f79e0fe2491b0 Mon Sep 17 00:00:00 2001 From: erjemin Date: Wed, 5 Aug 2026 22:27:56 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D1=80=D0=BE=D1=83=D1=82=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20=D0=B8=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0=20"?= =?UTF-8?q?=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F"?= =?UTF-8?q?=20(=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lpon_site/frontend/views.py | 47 +++++++++++++++++- lpon_site/lpon_site/urls.py | 1 + lpon_site/templates/roll/txt_list.html | 69 ++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 lpon_site/templates/roll/txt_list.html diff --git a/lpon_site/frontend/views.py b/lpon_site/frontend/views.py index 6553d81..0ff3a74 100644 --- a/lpon_site/frontend/views.py +++ b/lpon_site/frontend/views.py @@ -5,6 +5,8 @@ from dataclasses import dataclass from django.shortcuts import render from django.http import HttpRequest, HttpResponse +from frontend.models import TbArticle + # Create your views here. @@ -105,4 +107,47 @@ def catalog(request: HttpRequest | None) -> HttpResponse: BreadcrumbItem(title="Компакт-кассеты", url="/catalog/compact-cassettes"), # url передан -> обычный пункт со ссылкой BreadcrumbItem(title="Для перезаписи" ), # url передан -> обычный пункт со ссылкой ] - return render(request, 'catalog.html', {"breadcrumbs": breadcrumbs}) \ No newline at end of file + return render(request, 'catalog.html', {"breadcrumbs": breadcrumbs}) + + +def txt_articles_list(request: HttpRequest | None) -> HttpResponse: + """ + Представление (View) для отображения списка текстовых статей (тип ArticleType.TXT). + + Функциональность: + ----------------- + 1. Выбирает из БД все опубликованные статьи (b_article_published=True) с типом 'txt'. + 2. Сортирует их по полю приоритета i_article_sort (по возрастанию, чем меньше число — + тем выше в списке), затем по дате создания (-t_article_created) и названию. + 3. Оптимизирует выборку связанного файла обложки (k_article_to_image) через select_related, + чтобы избежать N+1 запросов при рендеринге изображений в списке. + 4. Формирует хлебные крошки (BreadcrumbItem) с элементом "Инструкции". + 5. Рендерит шаблон `txt_list.html`, передавая в контекст список статей и хлебные крошки. + + Аргументы: + request (HttpRequest | None): Объект HTTP-запроса Django. + + Возвращает: + HttpResponse: Сформированная HTML-страница со списком текстовых статей. + """ + # Выбираем опубликованные текстовые статьи из базы данных с правильной сортировкой + articles = ( + TbArticle.objects.filter( + l_article_type=TbArticle.ArticleType.TXT, + b_article_published=True, + ) + .select_related('k_article_to_image') + .order_by('i_article_sort', '-t_article_created', 's_article_title') + ) + + # Формируем цепочку хлебных крошек (пункт "Главная" добавляется автоматически в шаблоне) + breadcrumbs = [ + BreadcrumbItem(title="Инструкции"), + ] + + # Передаём контекст в шаблон списка текстовых статей + context = { + "articles": articles, + "breadcrumbs": breadcrumbs, + } + return render(request, "roll/txt_list.html", context) \ No newline at end of file diff --git a/lpon_site/lpon_site/urls.py b/lpon_site/lpon_site/urls.py index ad6a9d4..567a9bf 100644 --- a/lpon_site/lpon_site/urls.py +++ b/lpon_site/lpon_site/urls.py @@ -27,6 +27,7 @@ urlpatterns = [ re_path(r'^$', views.index), re_path(r'^catalog/$', views.catalog), + re_path(r'^info/?$', views.txt_articles_list, name='txt_articles_list'), ] # Сервировать медиа-файлы в разработке (в production использовать nginx/Apache) diff --git a/lpon_site/templates/roll/txt_list.html b/lpon_site/templates/roll/txt_list.html new file mode 100644 index 0000000..ca1f61e --- /dev/null +++ b/lpon_site/templates/roll/txt_list.html @@ -0,0 +1,69 @@ +{% extends "_base.html" %}{% load static %} + +{% block PAGE_TITLE %}Инструкции — LPON.RU{% endblock %} +{% block DESCRIPTION %}Информационные и текстовые материалы, правила, условия и справка LPON.RU{% endblock %} + +{% block CONTENT %} +{# Подключение блока хлебных крошек #} +{% include "block/breadcrumbs.html" %} + +
+ {# Заголовок страницы #} +

+ Инструкции +

+ + {# Список статей #} + {% if articles %} +
+ {% for article in articles %} +
+ {# Изображение обложки, если есть #} + {% if article.k_article_to_image %} +
+ {{ article.k_article_to_image.default_alt_text|default:article.s_article_title }} +
+ {% endif %} + + {# Заголовок статьи со ссылкой #} +

+ + {% if article.s_article_title_html %} + {{ article.s_article_title_html|safe }} + {% else %} + {{ article.s_article_title }} + {% endif %} + +

+ + {# Тизер / анонс статьи #} + {% if article.s_article_teaser_html %} +
+ {{ article.s_article_teaser_html|safe }} +
+ {% endif %} + + {# Подвал карточки с датой и кнопкой перехода #} +
+ {{ article.t_article_created|date:"Y.m.d" }} + + Читать полностью → + +
+
+ {% endfor %} +
+ {% else %} + {# Сообщение, если опубликованных статей типа TXT пока нет #} +
+

+ Пока нет опубликованных текстовых материалов. +

+
+ {% endif %} +
+{% endblock CONTENT %}