首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Django Templatetags中的RSS源返回项目

从Django Templatetags中的RSS源返回项目
EN

Stack Overflow用户
提问于 2013-03-20 06:12:07
回答 1查看 205关注 0票数 0

这里是Django菜鸟。

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

下面是我的代码:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
{% load my_tag %}
{% exampletag %}

这将导致在/u“源中的第一个条目”处出现KeyError。

如果我更改代码以追加到列表中,模板将不会出现错误,并且整个结构化列表将以单个字符串的形式输出。

这就是我想做的:

代码语言:javascript
运行
复制
{% load my_tag %}
{% for item in exampletag %}
<p> {{ item }} </p>
{% endfor %}

然而,这只是静默地失败了(显然我没有向模板传递一个可感兴趣的对象)

有什么想法吗?这是做这件事的好方法吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-20 10:25:27

这段代码看起来非常可疑:

代码语言:javascript
运行
复制
    for entry in feed.entries:
        entrylist[entry.title]

不是应该是这样的吗?

代码语言:javascript
运行
复制
    for entry in feed.entries:
        entrylist[entry.title] = entry     # or some value

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

但我还是不确定你到底想做什么。这里有两个想法,可能会让你开始。

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

类似于(未测试的):

代码语言:javascript
运行
复制
@register.inclusion_tag('feed_entries.html'):
def feed_entries():
    feed = feedparser.parse('example.rss')
    return {'items': feed}

feed_entries.html

代码语言:javascript
运行
复制
{% for item in items %}
<p> {{ item }} </p>
{% endfor %}

然后,在您想要显示项目列表的某个随机模板中:

代码语言:javascript
运行
复制
{% load feed_tags %}
...
<p>Here are the latest entries:</p>
{% feed_entries %}
...

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

想法二:如果您确实希望您的标记返回一个项目列表,那么可以使用assignment tag

代码语言:javascript
运行
复制
@register.assignment_tag
def feed_entries():
    return feedparser.parse('example.rss')

然后,在您的模板中,您必须“捕获”此标记(项目列表)的结果:

代码语言:javascript
运行
复制
{% feed_entries as items %}
{% for item in items %}
    <p>{{ item }}</p>
{% endfor %}

但这意味着您必须在每个模板中复制"as“和for-loop内容。如果您在许多模板中使用包含标记,则可以省去输入和维护工作。但是,如果您希望在每个模板中以不同的方式呈现列表,那么它将更加灵活。假设您想要它在一个<p>标记列表中,但在另一个<ul>中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15511525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档