0

Django noob です。

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 %}

これにより、/ u'The First Entry In The Feed' で KeyError が発生します

コードをリストに追加するように変更すると、テンプレートはエラーなしでレンダリングされ、構造化されたリスト全体が 1 つの文字列で出力されます。

これは私がやりたいことです:

{% 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つのアイデアがあります。

アイデア1:包含タグを書く必要があるように見えます。

(未テスト)のようなもの:

@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 %}

アイデア2:タグが本当にアイテムのリストを返すようにしたい場合は、割り当てタグを使用できます。

@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ループのものを複製する必要があることを意味します。インクルージョンタグは、多くのテンプレートで使用する場合、入力とメンテナンスを節約できます。ただし、テンプレートごとにリストを異なる方法でレンダリングする場合は、より柔軟になります。あるタグのリストにそれを入れたいが、別の<p>タグのリストに入れたいとしましょう<ul>

于 2013-03-20T02:25:27.200 に答える