这里是Django菜鸟。
我正在尝试使用templatetags (带有classytag)将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 %}这将导致在/u“源中的第一个条目”处出现KeyError。
如果我更改代码以追加到列表中,模板将不会出现错误,并且整个结构化列表将以单个字符串的形式输出。
这就是我想做的:
{% load my_tag %}
{% for item in exampletag %}
<p> {{ item }} </p>
{% endfor %}然而,这只是静默地失败了(显然我没有向模板传递一个可感兴趣的对象)
有什么想法吗?这是做这件事的好方法吗?
提前谢谢。
发布于 2013-03-20 10:25:27
这段代码看起来非常可疑:
for entry in feed.entries:
entrylist[entry.title]不是应该是这样的吗?
for entry in feed.entries:
entrylist[entry.title] = entry # or some value现在,您正试图索引到一个空字典中,因此得到了一个KeyError异常。
但我还是不确定你到底想做什么。这里有两个想法,可能会让你开始。
想法一:看起来你应该写一个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代码片段,它将获取返回的字典并呈现feed_entries.html模板,生成的{% feed_entries %}放在您编写{% 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内容。如果您在许多模板中使用包含标记,则可以省去输入和维护工作。但是,如果您希望在每个模板中以不同的方式呈现列表,那么它将更加灵活。假设您想要它在一个<p>标记列表中,但在另一个<ul>中。
https://stackoverflow.com/questions/15511525
复制相似问题