Поки статей ще не багато на новому сайті, додам я 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})
Статті знаходяться в модулі знання і поділяються за розділами. Тому для формування повної адреси використовується дві змінні:
- адреса розділу
- 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 вообще не понимает, что происходит.
приходится писать так