0

Django 菜鸟在这里。

我正在尝试使用 templatetags(带有 classytags)将 RSS 提要项添加到 django 模板中。

这是我的代码:

from django import template
from classytags.core import Tag
import feedparser

register = template.Library()

class ExampleTag(Tag):
name = 'exampletag'
    def render_tag(self, context):
        raw_feed = "example.com/feed.rss"

        feed = feedparser.parse(raw_feed)
        entrylist = {}

        for entry in feed.entries:
            entrylist[entry.title]


    return entrylist

register.tag(ExampleTag)

然后,在模板中,我可以调用 ExampleTag:

{% load my_tag %}
{% exampletag %}

这会导致 KeyError 在 /u'The First Entry In The Feed'

如果我将代码更改为附加到列表,则模板将无错误地呈现,并且整个结构化列表以单个字符串输出。

这就是我想做的:

{% load my_tag %}
{% for item in exampletag %}
<p> {{ item }} </p>
{% endfor %}

然而,这只是默默地失败(显然我没有将可交互对象传递给模板)

有任何想法吗?这甚至是这样做的好方法吗?

提前致谢。

4

1 回答 1

1

这段代码看起来很可疑:

    for entry in feed.entries:
        entrylist[entry.title]

不应该是这样的吗?

    for entry in feed.entries:
        entrylist[entry.title] = entry     # or some value

因为现在你正试图索引一个空字典,因此得到了一个KeyError例外。

但是我仍然不确定您要做什么。这里有 2 个可以帮助您入门的想法。

想法一:看起来你应该写一个包含标签

类似(未经测试):

@register.inclusion_tag('feed_entries.html'):
def feed_entries():
    feed = feedparser.parse('example.rss')
    return {'items': feed}

而在feed_entries.html

{% for item in items %}
<p> {{ item }} </p>
{% endfor %}

然后,在您希望显示项目列表的一些随机模板中:

{% load feed_tags %}
...
<p>Here are the latest entries:</p>
{% feed_entries %}
...

这是假设feed包含您想要以某种方式呈现的项目列表。因此,每当您{% feed_entries %}在模板中使用时,都会调用您的 Python 片段,它会获取返回的字典并呈现feed_entries.html模板,并将生成的 HTML 放置在您编写的任何位置{% feed_entries %}

想法二:如果您真的希望您的标签返回项目列表,您可以使用分配标签

@register.assignment_tag
def feed_entries():
    return feedparser.parse('example.rss')

然后在你的模板中你必须“捕捉”这个标签的结果(项目列表):

{% feed_entries as items %}
{% for item in items %}
    <p>{{ item }}</p>
{% endfor %}

但这意味着您必须在每个模板中复制“as”和 for-loop 内容。如果您在许多模板中使用包含标签,则可以节省您的打字和维护。但是,如果您想在每个模板中以不同的方式呈现列表,它会更加灵活。假设您希望它在一个<p>标签列表中,但在<ul>另一个标签列表中。

于 2013-03-20T02:25:27.200 回答