]> Panopticon :: Django :: DjangoでRSSリーダーを作る(4) カスタムタグ内で別の変数を参照したいとき

<< Python Challenge(2) | main | Python Challenge(3) >>

DjangoでRSSリーダーを作る(4) カスタムタグ内で別の変数を参照したいとき

解決しました。

JJinuxLand: Python: Django Custom Tags

登録されたRSSから各記事を取得したいとき。RSSのURIを引数として、タイトルや記事の内容のディクショナリを返すカスタムタグ、rss_getを定義した。しかし、テンプレート内で

{% load rss_get %} 
<html>
<head>
<title>Admin's RSS Reader</title>
</head>
<body>
{% for site in object_list %}
   <h1>{{ site.title }}</h1>
   {% rss_get site.rss as entries %}
   {% for entry in entries  %}
      <h2>{{ entry.title }}</h2>
      <p>{{ entry.description }}</p>
   {% endfor %}
{% endfor %}
</body>
</html>

のように書くと、rss_getの引数site.rssがURIに置き換えられず、文字列"site.rss"がそのまま渡されてしまう(rss_getタグ以外の場所、例えばforタグ内でsite.rssを参照した場合には正しくURIに置換される)という問題。

与えられた文字列についてcontextを参照して解決するメソッドtemplate.resolve_variables()を使えばよい。引数としてcontextをとるのでrenderメソッドなどcontextが参照できるところから呼び出してやる。

template.resolve_variables(variable_str, context)

この場合は

def render(self, context):
        f = feedparser.parse(template.resolve_variable(self.rss, context))
        context[self.variable] = f.entries
        return ''

結果rss_get.pyはこうなりました。

from django import template
from rss.site.models import Site
import feedparser

register = template.Library()

def do_rss_get(parser, token):
        bits = token.contents.split()
        if len(bits) != 4:
                raise template.TemplateSyntaxError, "'%s' requires 3 arguments" % bits[0
]
        if bits[2] != "as":
                raise template.TemplateSyntaxError, "'%s' 's 2nd argument must be 'as'"
% bits[0]
        return RSSNode(bits[3], bits[1])

class RSSNode(template.Node):
        def __init__(self, variable, rss):
                self.variable = variable
                self.rss = rss
        def render(self, context):
                f = feedparser.parse(template.resolve_variable(self.rss, context))
                context[self.variable] = f.entries
                return ''

register.tag('rss_get',do_rss_get)

そしてこんな感じに。

python070501.jpg

カテゴリ

Trackback URI

http://www.panopticon.jp/mt/mt-tb.cgi/76

Trackbacks(0)

コメントする