Пока статей ещё не много на новом сайте, добавлю-ка я RSS-ленту , благо, что Django имеет встроенный функционал для организации RSS-лент, как в обычном формате, так и в формате Atom. Но для начала ограничусь добавлением обычно ленты новостей, которая может быть подключена к сервису FeedBurner, а также найдена на сайте каким-нибудь RSS-Ридером. Я, например, использую QuiteRSS , который, к слову говоря, написан на Qt5.
Что требуется для организации RSS-ленты в минимальном варианте:
- Добавить ссылку на ленту в тело head -тега страницы;
- Написать представление, которое будет отвечать за подготовку ленты;
- Модифицировать модель, по объектам которой будет строиться лента новостей.
Добавление ссылки на RSS-ленту
Для начала добавим ссылку на RSS-Ленту в заголовок страницы. Зачем это нужно? - Это необходимо для того, чтобы RSS-ридеры могли без проблем обнаружить ленту при сканировании сайта. Если не указать ссылку, то пользователю придётся вручную искать вашу RSS-ленту.
<head> ... <link rel="home" type="application/rss+xml" href="http://example.com/feed" /> ... </head>
В данном случае RSS-лента указана по адресу feed.
Реализация представления
Для реализации представления нам потребуется класс Feed, а также импортировать ту модель, по объектам которой будет строиться лента новостей. Естественно выбрана модель Article, про которую я уже рассказывал в статье по Модели, Шаблону и Представлению , которые используются на этом сайте.
from django.contrib.syndication.views import Feed from knowledge.models import * class ArticlesFeed(Feed): title = "EVILEG - Практическое программирование" description = "Последние статьи сайта EVILEG о программировании и информационных технологиях" link = "/" def items(self): return Article.objects.exclude(article_status=False).order_by('-article_date')[:10] def item_title(self, item): return item.article_title def item_description(self, item): return item.article_content[0:400] + "<p>Статья впервые появилась на <a href="\"https://evileg.com/ru\"">EVILEG " \ "- Практическое программирование</a></p>"
Итак, для того, чтобы воспользоваться возможностями RSS-ленты, необходимо наследоваться от класса Feed. Переопределить поле title, которое будет названием вашего RSS-канала, переопределить поле description, которое является описание вашего RSS-канала, а также обязательно указать адрес канала, но поскольку у меня этим каналом является главная страница сайта, то в качестве ссылка указан слеш.
ВНИМАНИЕ: Если не указать ссылку хотя бы так, будут сыпаться ошибки, и ничего не заработает.
Метод items возвращает 10 последних статей, исключая те, которые имеют статус черновика.
Метод item_title соответственно подставляет название статьи.
Метод item_description подставляет описание статьи из поля article_content в модели. При этом в описание попадают первые 400 символов в статье и дополнительная подпись с обратной ссылкой на сайт. Обратная ссылка на сайт сделана, чтобы агрегаторы новостей, которые будут пастись на вашем сайте оставляли обратные ссылки на сайт у себя.
Модификация Модели Article
Ключевым моментом является то, что обязательно наличие метода get_absolute_url, который также используется представлением RSS-ленты. Данный метод возвращает абсолютный адрес страницы и без него также будут сыпаться ошибки.
Вот такой метод добавлен в модель Article.
def get_absolute_url(self): return reverse('knowledge:article', kwargs={'section': self.article_section.section_url, 'article_id': self.id})
Статьи находятся в модуле knowledge и разделяются по разделам. Поэтому для формирования полного адреса используется две переменных:
- адрес раздела
- id статьи
URL шаблон выглядит следующим образом:
url(r'^(?P[\w]+)/(?P<article_id>[0-9]+)/$', views.EArticleView.as_view(),
Добавление шаблона URL для RSS
И чтобы всё заработало, осталось добавить шаблон URL для RSS. У меня данный шаблон находится в модуле home , как и вся лента новостей, кроме модели статей. И выглядит данный шаблон следующим образом.
from django.conf.urls import url from . import views urlpatterns = [ url(r'^feed/$', views.ArticlesFeed()), ]
Для Django рекомендую VDS-сервера хостера Timeweb .
Тут мне тоже есть что сказать=)
Сами разрабы советуют импортировать следующим образом:
Стоит избегать
или
в первом случае некоторым IDE срывает крышу=) (а вообще это несколько опасно, особенно в случае с джангой - можно импортнуть не то и не оттуда)
а во втором может случиться коллизия, например в двух модулях есть классы с одним и тем же именем (ну мало ли). и вот не угадаешь, какой будет в итоге=)
Явное лучше неявного=)
Что интересно, если написать так
,то PyCharm сносит крышу, если разрабатываешь в рамках проекта приложение, которое подготавливается в качестве самостоятельного приложения, которое в дальнейшем можно будет устанавливать через pip . То есть если оно имеет структуру гит репозитория, как, например, evileg_core
PyCharm вообще не понимает, что происходит.
приходится писать так