]>
<< Python Challenge(2) | main | Python Challenge(3) >>
解決しました。
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)
そしてこんな感じに。
![]()
http://www.panopticon.jp/mt/mt-tb.cgi/76
コメントする