Модель наследования и фреймворк RSS - PullRequest
1 голос
/ 15 июня 2010

Я использую наследование моделей для управления набором запросов нескольких моделей:

from django.db import models
from django.contrib.sites.models import Site
from django.contrib.auth.models import User
from imagekit.models import ImageModel
import datetime

class Entry(models.Model):
    date_pub = models.DateTimeField(default=datetime.datetime.now)
    author = models.ForeignKey(User)
    via = models.URLField(blank=True)
    comments_allowed = models.BooleanField(default=True)

    class IKOptions:
        spec_module = 'journal.icon_specs'
        cache_dir = 'icon/resized'
        image_field = 'icon'


class Post(Entry):  
    title = models.CharField(max_length=200)
    description = models.TextField()
    slug = models.SlugField(unique=True)

    def __unicode__(self):
        return self.title


class Photo(Entry):
    alt = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    original = models.ImageField(upload_to='photo/')    

    def __unicode__(self):
        return self.alt


class Quote(Entry):
    blockquote = models.TextField()
    cite = models.TextField(blank=True)

    def __unicode__(self):
        return self.blockquote

Условного шаблона достаточно, чтобы отобразить правильные фрагменты html с представлением, основанным на Entry.objects.all () :

{% extends "base.html" %}
{% block main %}
<hr>
{% for entry in entries %}

{% if entry.post %}
[...do something with entry.post]
{% endif %}

{% if entry.photo %}
[...do something with entry.photo]
{% endif %}

[...and so on]

Теперь я пытаюсь сгенерировать RSS-канал, используя новую фреймворк Feed, показанный в Django 1.2, но безуспешно ... Чрезмерно упрощенные настройки фреймворка не позволяют мне указать условные item_title и item_description на основе дочерних объектов Entry:

from django.contrib.syndication.views import Feed
from totanus.journal.models import Entry, Photo, Post, Quote


class LatestEntriesFeed(Feed):
    title = "RSS Feed"
    link = "/journal/"
    description = "Journal RSS"

    def items(self):
           return Entry.objects.order_by('-date_pub')[:10]

    def item_title(self, item):
           # if child is Post
           return item.post.title # this isn't working, of course...

Должен ли я создать настраиваемый набор шаблонов представления для управления созданием и распространением RSS или есть способ использовать инфраструктуру каналов с этой подклассовой моделью?

1 Ответ

2 голосов
/ 15 июня 2010

У вас есть две опции:

  1. использовать атрибуты title_template и description_template класса Feed для указания шаблонов, которые могут обрабатывать очень общую входную переменную.

  2. Воссоздайте логику вашего шаблона в методах класса фида, чтобы ваша переменная шаблона получила нормализованный фрагмент данных.

Любой из них приведет вас кта же самая конечная точка.

...