Die im Kapitel Mehrere Datenbanken nutzen erstellte App “news” hat noch kein Frontend und soll deshalb einen RSS Feed bekommen.
Dazu legst du zuerst die Datei news/feeds.py an:
from django.conf import settings
from django.contrib.syndication.views import Feed
from news.models import Article
class ArticleFeed(Feed):
title = 'Neuigkeiten aus dem Kochbuch'
link = '/'
description = 'Der RSS Feed der Kochbuch Website'
def items(self):
return Article.objects.order_by('-date_created')[:settings.NEWS_FEED_COUNT]
def item_title(self, item):
return item.headline
def item_description(self, item):
return item.body
Da wir die Anzahl der Elemente im RSS Feed aus der Datei settings.py lesen müssen wir sie auch dort definieren:
NEWS_FEED_COUNT = 5
Dann erstellst du die URLConf in news/urls.py:
from django.conf.urls import patterns, include, url
from news.feeds import ArticleFeed
from news.views import ArticleDetailView, ArticleListView
urlpatterns = patterns('',
url(r'^feed/rss/$', ArticleFeed(), name='news_article_feed'),
url(r'^(?P<pk>\d+)/$', ArticleDetailView.as_view(), name='news_article_detail'),
url(r'^$', ArticleListView.as_view(), name='news_article_list'),
)
Und bindest diese danach in der URLConf in cookbook/urls.py ein:
urlpatterns = patterns('',
...
url(r'^news/', include('news.urls')),
url(r'^', include('recipes.urls')),
)
Außerdem musst du das News Model in news/models.py noch mit einer get_absolute_url Methode ausstatten:
@models.permalink
def get_absolute_url(self):
return ('news_article_detail', (), {'pk': self.pk})
Jetzt die (sehr einfachen) Views für den Feed in news/views.py erstellen:
from django.views.generic import DetailView, ListView
from news.models import Article
class ArticleDetailView(DetailView):
model = Article
class ArticleListView(ListView):
model = Article
Und am Ende die Templates anlegen.
Das Template templates/base.html um den Eintrag für den Feed erweitern:
<head>
<title>{% block title %}Kochbuch{% endblock %}</title>
<link rel="alternate" type="application/rss+xml"
title="Neuigkeiten aus dem Kochbuch" href="{% url news_article_feed %}" />
</head>
Das Template für die Liste der Feed Elemente news/templates/news/article_list.html anlegen:
{% extends "base.html" %}
{% block title %}{{ block.super }} - News{% endblock %}
{% block content %}
<ul>
{% for article in article_list %}
<li>
<h4><a href="{{ article.get_absolute_url }}">{{ article.headline }}</a></h4>
<p>{{ article.date_updated }}</p>
<p>{{ article.body }}</p>
</li>
{% endfor %}
</ul>
{% endblock %}
Das Template für ein Feed Element news/templates/news/article_detail.html anlegen:
{% extends "base.html" %}
{% block title %}{{ block.super }} - {{ article.headline }}{% endblock %}
{% block content %}
<h4>{{ article.headline }}</h4>
<p>{{ article.date_updated }}</p>
<p>{{ article.body }}</p>
{% endblock %}
Damit die Links im RSS Feed auch funktionieren muss noch die Site im Admin angepasst werden. Dazu im Admin die Liste der Sites anzeigen und die Site mit dem Domainnamen example.com zum Bearbeiten auswählen. Statt example.com muss als Domainname 127.0.0.1:8000 eingetragen werden. Der Anzeigename muss nicht unbedingt geändert werden - es schadet aber auch nicht.