Evgenii Legotckoi
Evgenii LegotckoiШілде 5, 2018, 3:05 Т.Ж.

Django - Оқулық 035. SERP-де мазмұнның әртүрлі түрлерін көрсетуге арналған әртүрлі үлгілер

Сайттағы іздеуді пайдаланатын сайтқа тұрақты келушілер мақалаларды көрсету сайттың іздеу нәтижелеріндегі пікірлерді көрсетуден басқаша екенін байқаған шығар. Бұған әрбір мазмұн түрінің іздеуде қандай мазмұн табылғанына байланысты бет көрсетілген кезде ауыстырылатын өзіндік көрсету үлгісі болуы арқылы қол жеткізілді.

Шығару мысалын қарастырайық.

Көрдіңіз бе, мұнда түсініктеме презентациясы мақаладан өзгеше, бірақ олар алдыңғы мақалада жасалғандай бірдей іздеу нәтижелерінде көрсетіледі.

Бірақ бұл басқаша арқылы таңдаудан әлдеқайда талғампаз. Шынымды айтсам, маған бұл шешім өте ұнайды.


Әрбір деректер үлгісі үшін осы үлгінің нысанын көрсету үшін үлгіге жолды сақтайтын өрісті анықтау қажет. Бұл жағдайда әрбір үлгіде бұл өрістің аты бірдей болуы керек. Бұл өте маңызды.

Мысалы, мұны істейік

class Article(models.Model):
    TEMPLATE_PREVIEW = 'home/article_preview.html'

class Comment(models.Model):
    TEMPLATE_PREVIEW = 'home/comment_preview.html'

class Topic(models.Model):
    TEMPLATE_PREVIEW = 'home/topict_preview.html'

class Post(models.Model):
    TEMPLATE_PREVIEW = 'home/post_preview.html'

Осы үлгілердің әрқайсысында біз өзіміздің мазмұнды көрсетуді белгілей аламыз, бұл талап етілмейді. Мысалы, мақала үшін

<div>
    <a href="{{ object.get_absolute_url }}"><h2>{{ object.itle }}</h2></a>
    {{ object.content|safe }}
    <p><a class="btn btn-default btn-sm" href="{{ object.get_absolute_url }}">Читать далее</a></p>
</div>

Барлық басқа үлгілер үшін біз басқа нәрсе жаза аламыз. Ең бастысы, барлық әдістер мен өрістер, сондай-ақ бір нысанның аты барлық үлгілерде бірдей болуы керек.

Ал іздеу нәтижелері үлгісінің өзі келесідей болуы мүмкін

{% load tz %}
{% load trans from i18n %}
{% load bootstrap_pagination from bootstrap4 %}
<div id="object-list">
    {% for object in object_list %}
        {% include object.TEMPLATE_PREVIEW %}
    {% empty %}
        <div class="card card-body mb-3">{% trans 'Ничего не найдено' %}</div>
    {% endfor %}
    {% bootstrap_pagination object_list pages_to_show="10" url=last_question %}
</div>

Нюанс мынада, біз include тегіне жол үлгісінің атауын беруге дағдыланғанбыз, мысалы

{% include 'home/article_preview.html' %}

Бірақ ешкім мұны істеудің жалғыз жолы деп айтқан жоқ, сонымен қатар мазмұнын көрсеткіміз келетін нысаннан үлгіге жолды тікелей ала алмайтынымызды ешкім айтқан жоқ. Яғни, сіз оңай жаза аласыз

{% include object.TEMPLATE_PREVIEW %}

Ал егер әрбір нысанның өзінің TEMPLATE_PREVIEW бар екенін ескерсек, онда ондағы файлдар басқаша қосылады, яғни мазмұнның әр түрінің өзіндік көрсету стилі болады.

Django үшін VDS хостингін ұсынамын TIMEWEB

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

bernar92
  • Шілде 5, 2018, 3:58 Т.Ж.

интересное решение! интересно как реализовать такое через

Django REST

Evgenii Legotckoi
  • Шілде 5, 2018, 4:12 Т.Ж.

К сожалению, я сейчас мало использую django_rest_framework , но в будущем планирую значительную часть работы сайта переводить на него. Поэтому придумаю какое-нибудь подобное решение с использованием какого-нибудь JS-шаблонизатора.

Илья Чичак
  • Шілде 16, 2018, 10:01 Т.Қ.

Идея с классовыми параметрами интересна, однако при большом количестве элементов, это может занять значительные время. И дело даже не в решении, а в тэге include. При его использовании, шаблон будет искаться для каждого использования без учёта того, что это один и тот же шаблон. Если выводится 50, 100 или сколько-нибудь адекватное количество элементов - можно жить, но надо помнить, что в этом месте можно неслабо так порезаться.

И ещё одна проблема, что шаблоны не грузятся в память при запуске сервера. Так что без какого-нибудь кэширования этих шаблонов можно упереться в рендеринг, как в узкое место.
Evgenii Legotckoi
  • Шілде 17, 2018, 2:31 Т.Ж.

Согласен с вами!

И в каком-то смысле предвкушаю возможные проблемы. В данном варианте действительно потребуется как минимум кеширование, а как максимум дополнительное совершенствование, возможно стоило бы сделать рендеринг несколько иным способом, через классовый метод, например, возможно это позволит проще реализовать кеширование. Что думаете по этому поводу?
Для меня довольно большим плюсом в данном случае является увеличение скорости разработки за счёт шаблонизации и переиспользования повторяющихся частей кода.


bernar92
  • Шілде 17, 2018, 2:57 Т.Ж.

через классовый метод не обойтись

bernar92
  • Шілде 17, 2018, 3:01 Т.Ж.

мне кажется лучше это сделать на стороне клиента где при помощи vue js! а в модель сделать свойство по которому js будет генерирывать шаблон

Evgenii Legotckoi
  • Шілде 17, 2018, 3:04 Т.Ж.

А я вот планирую внедрять nunjucks, он очень сильно похож по синтаксису на шаблоны Django, и также поддерживает наследование шаблонов. Пробный запуск я уже делал и весьма понравилось. Но пока не внедрял в качестве боевого варианта, есть ещё где развернуться по оптимизациям на стороне сервера.

Илья Чичак
  • Шілде 17, 2018, 3:43 Т.Ж.
Я тут поэксперементировал. И что-то у меня не особо получилось сделать inclusion_tag и сунуть указатель на него в классовую переменную.
Я думаю, можно чуть глубже погрузиться в механизм шаблонных тэгов и попробовать сделать один тэг, в который передается объект модели, а он выбирает нужный шаблон и рендерит его.

либо не греть голову и сделать несколько тэгов - для каждой модели. а в классе модели определить какую-то переменную (например однобуквенную:) ) по которой бы определялось, какой тэг использовать. а если этот механизм часто используется, код выбора нужного тэга сунуть в еще один шаблон и сделать inclusion_tag. получится длинная цепочка, и, возможно, немного запутанная, но получится достаточно быстро
bernar92
  • Шілде 17, 2018, 4 Т.Ж.

запутанная... уже что-то пугает ....

Evgenii Legotckoi
  • Шілде 17, 2018, 5:02 Т.Ж.

Мысль о inclusion_tag мне весьма импонирует. Как вариант, можно хранить также путь к шаблону в параметре класса, а в данном теге уже искать шаблоны и делать кеширование, чтобы не скать каждый раз.

Также в качестве аргументов передавать в этот тег объект и имя параметра, а потом через getattr брать из объекта ту переменную... тогда получится один единственный тег для всех видов шаблонов, например TEMPLATE_PREVIEW, TEMPLATE_INFO и т.д.
Илья Чичак
  • Шілде 17, 2018, 5:29 Т.Ж.

Вообще, я полностью согласен. Подобное лучше всего отдать на откуп клиенту.

Илья Чичак
  • Шілде 17, 2018, 5:32 Т.Ж.

Запутанность - условная. Будет просто цепочка вызовов inclusion_tag-ов. Причём первое звено нужно лишь для возможности повторного использования. Если таковое не предполагается, можно опустить один уровень.

Evgenii Legotckoi
  • Шілде 17, 2018, 5:43 Т.Ж.

Думаю, что это всё равно стоит оставить для индексирующих роботов поисковых систем, которые испоьлзуют простые GET запросы. Они же AJAX не используют. Так что полностью уйти от этого не получится, если есть открытый контент на сайте.

Илья Чичак
  • Шілде 17, 2018, 5:53 Т.Ж.
тут все упирается в то, что вы хотите дать поисковым роботам. был у меня опыт проектирования страницы для роботов - сделал точки входа - со статикой для роботов и АПИ для JS клиента=) а отлавливал по UserAgent-у на уровне миддлвари (они особо не шифруются).
Если использовать JS, то можно и выводить порционно, подгружая новые объекты по мере скролла к концу текущего списка=) Тогда вообще нагрузки будет минимум. и отрисовывать будет моментально (при достаточно малых размеров порций данных).

А по поводу inclusion_tag-ов - не так просто заставить их работать из мета-программирования=( мне вот пришла в голову мысль, что можно было бы строить эти тэги в момент инициализации рантайма. тоесть где-то в templatetags модуле сканировать нужные модели, брать из них классовые переменные и на их основе создавать тэги. Но я бы поостерегся - очень много нюансов. и в первую очередь, можно очень быстро запутаться, а потом не разобраться=/

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 11:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 9:02 Т.Қ.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 9, 2024, 5:43 Т.Ж.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 12:50 Т.Қ.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 2:15 Т.Қ.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 11 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 3:46 Т.Қ.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 3, 2024, 12:07 Т.Ж.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз