【问题标题】:Return items from RSS feed in Django Templatetags从 Django Templatetags 中的 RSS 提要返回项目
【发布时间】:2013-03-19 22:12:06
【问题描述】:

这里是 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 at /u'The First Entry In The Feed'

如果我将代码更改为附加到列表,则模板会正确呈现,并且整个结构化列表会以单个字符串的形式输出。

这是我想做的:

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

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

有什么想法吗?这甚至是一个很好的方法吗?

提前致谢。

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    这段代码看起来很可疑:

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

    不应该是这样的吗?

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

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

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

    想法一:看起来你应该写一个inclusion tag

    类似的东西(未经测试):

    @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 的 sn-p,它会获取返回的字典并呈现 feed_entries.html 模板,并将生成的 HTML 放置在您编写 {% feed_entries %} 的任何位置。

    想法二:如果你真的希望你的标签返回一个项目列表,你可以使用assignment tag

    @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 内容。如果您在许多模板中使用包含标签,则可以节省您的打字和维护。但是,如果您想在每个模板中以不同的方式呈现列表,它会更加灵活。假设您希望它在一个 &lt;p&gt; 标签列表中,但在另一个 &lt;ul&gt; 中。

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2010-11-22
      • 2011-07-26
      • 1970-01-01
      相关资源
      最近更新 更多