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 %}