Реклама

Поиск

Модель, шаблон и представление в Django

TutorialDjangomodel, template, view428

В Django используется модульная система приложения, когда одно приложение состоит из нескольких приложений, отвечающих каждое за свой функционал. Как Вы успели заметить, на момент написания статьи, на сайте присутствует раздел "База Знаний", в котором присутствует несколько разделов, по которым уже разделены статьи.

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

Предлагаю разобраться, как это реализуется в минимальном варианте на примере EVILEG COM.

Добавление Pagination на основе django-bootstrap3

TutorialDjangoPagination, Python, django-bootstrap3545

Количество статей на новом сайте начало приближаться к 10 штукам, поэтому в срочном порядке добавляю Pagination, чтобы была возможность пролистывать страницы на сайте. Но поскольку уже используется модуль django-bootstrap3, то и Pagination будет использоваться из этого модуля. Зачем же делать лишнюю работу, когда уже всё сделано? Не так ли.

Для добавления Pagination необходимо:

  1. Использовать класс Paginator из django.core.pagination;
  2. Добавить в шаблон главной страницы bootstrap_pagination с привязкой ;
  3. Добавить проверку текущего номера страницы;
  4. И ... не добавлять ничего нового в шаблоны url.  

Реклама

Внедрение поиска по сайту с пагинацией результатов

TutorialDjangoПоиск, Postgres, Search1284

Для организации поиска на сайте, который основан на Django, и использует базу данных PostgreSQL можно использовать модуль для поиска по этой базе данных, поставляемый с Django. Тем более, что данный поиск обеспечивает полнотекстовый поиск в достаточной мере для небольшого ресурса. 

Но для того, чтобы выдача поисковых запросов походила больше на главную страницу, добавим возможность пагинации страниц выдачи, а результаты будут выводиться по 10 штук на одной странице. И для этого также будем использовать модуль django_bootstrap3.    

В итоге имеем следующий план действий:

  1. Добавляем приложение для организации поиска;
  2. Добавляем url поиска;
  3. Добавляем форму поиска;
  4. Описываем шаблон страницы поиска.
  5. Описываем представление для обработки выдачи поиска;

Вывод списка популярных статей на Django

TutorialDjangoDjango, популярные статьи, статистика1451

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

Первое, что было решено сделать - это вывод списка популярных статей. Первый вариант популярных статей был основан на общем счётчике просмотров и в итоге выводил статьи с самым большим количество просмотров. Это в целом плохой вариант, поскольку в ТОПе в итоге окажутся статьи просто набравшие самое большое количество просмотров за всё время. 

Следовательно нужно было что-то менять. В результате был внедрен вывод популярных статей за последние 7 дней в самом простом варианте. То есть, добавлена была таблица в которую вносится количество просмотров статей по дням. Конечно, точность подсчётов при большой нагрузке может очень сильно варьироваться, но пока посещаемость не достигла 5000 - 10000 уникальных посетителей в сутки - это не настолько важно.

А теперь давайте разберём пример того, как сделать такой список популярных статей средствами Django

Добавление файлов Sitemap на сайт с Django

TutorialDjangoSitemap, Python, Static Sitemap670

RSS добавлена, но нужно помочь поисковым системам индексировать сайт. А делается это с помощью файлов Sitemap, которые описывают структуру сайта. Django предоставляет готовые классы и механизмы для формирования файлов Sitemap, причём имеется возможность для формирования вложенных в основной Sitemap, то есть дочерних файлов Sitemap, которые будут отвечать за определённые разделы. Также Django имеет возможность кеширования файлов Sitemap, что полезно в том случае, если на сайте присутствуют десятки тысяч ссылок.

С точки зрения текущего состояния сайта EVILEG COM будет сформировано три файла Sitemap, которые будут вложены в один главный:

  • Основной Sitemap с постоянными страницами и главной страницей сайта;
  • Sitemap разделов;
  • Sitemap статей.

Добавление комментариев на сайт с Django

TutorialDjangoКомментарии, Django, Python, Materialized Path1929

Взявшись за реализацию комментариев на сайте под Django, я с удивлением обнаружил, что Django не предоставляет никаких модулей для реализации комментариев. Вернее он предоставлял его раньше, это был модуль django.contrib.comments, но в версии 1.7 его объявили как deprecated и предложили либо пилить самостоятельно, либо воспользоваться чем-нибудь вроде Disqus. Хорошо, он вроде тоже поддерживает подсветку синтаксиса кода, но... в статьях одна подсветка, в комментариях другая - это будет некрасиво. 

Поэтому будем внедрять собственный велосипед и ловить свои баги.

Для реализации комментариев необходимо:

  • Добавить новую модель, назовём её Comment;
  • Добавить представление, которое будет обрабатывать добавление комментария;
  • Добавить форму для ввода комментария;
  • Воспользоваться для организации древовидной структуры подходом Materialized Path;

Кастомизация страниц ошибок 403, 404, 500

TutorialDjango403, 404, 500, Python592

Многие ресурсы имеют оформленные страницы ошибок, если происходит сбой в обработке запроса от клиента. 
Для начала на сайте была сделана кастомизация наиболее часто возникающих ошибок, другие при отладке пока не попадались, но всё впереди.

Как объявлено в заголовке статьи, кастомизированы был следующие ошибки:

  1. 403 - Ошибка авторизации, доступ запрещён.
  2. 404 - Страница не найдена;
  3. 500 - Внутренняя ошибка сервера;

Добавление RSS ленты на сайт с Django

TutorialDjangoRSS, Feed, Python572

Пока статей ещё не много на новом сайте, добавлю-ка я RSS-ленту , благо, что Django имеет встроенный функционал для организации RSS-лент, как в обычном формате, так и в формате Atom. Но для начала ограничусь добавлением обычно ленты новостей, которая может быть подключена к сервису FeedBurner, а также найдена на сайте каким-нибудь RSS-Ридером. Я, например, использую QuiteRSS , который, к слову говоря, написан на Qt5.

Что требуется для организации RSS-ленты в минимальном варианте:

  1. Добавить ссылку на ленту в тело head -тега страницы;
  2. Написать представление, которое будет отвечать за подготовку ленты;
  3. Модифицировать модель, по объектам которой будет строиться лента новостей.

Контактная форма на Django

TutorialDjangoконтакты, контактная форма, Django1524

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

Тем более, что для сайта на Wordpress это было для меня больной темой. Наверное, всему виной была лень, ибо у меня так и не возникло желания начать разбираться с PHP, чтобы набросать контактную форму самостоятельно (в итоге был задействован очередной плагин).

А если учесть, что разработка на Django, предполагает достаточно частую работу с различными формами данных и при этом имеется модуль для работы с почтовыми сервисами, то и добавление подобной формы не представляет особого труда.

Вывод списка популярных статей на любой странице сайта

TutorialDjangoDjango, templatetags, список популярных статей, Python512

На сайте уже была статья о выводе списка популярных статей за последние 7 дней . Но в том варианте, который использован в данной статье, показано, как сделать вывод на странице со статьями. Но возник вопрос, как быстро внедрять список популярных статей на любую страницу сайта.

У себя я решил эту проблему с использованием собственного тега , который может быть использован в шаблоне Django. То есть, вместо того, чтобы в каждом View на сайте прописывать один и тот же код для получения списка статей или использования одной и той же функции в этих View, я просто сделал отдельный шаблон с уже готовой разметкой для списка популярных статей, в котором используется мой пользовательский тег, которым я забираю список этих статей. Таким образом, нужно только внедрять данный шаблон в нужном месте в шаблоне страницы с помощью тега include.

Реклама

Реклама

Реклама