'parser.compile_filter(tokens [2])'的Django自定义模板标签不起作用
问题描述:
我试着实现T. Stone对我的问题“我怎么做 - of-parameters-to-views-in-django“([link text] [1])。
我无法得到任何结果。很难找到有关compile_filter()
的信息,但据我了解,cls(queryset=parser.compile_filter(tokens[2]), template=template)
应该使用“变量”标记[2]来呈现模板。但这似乎并不奏效。'parser.compile_filter(tokens [2])'的Django自定义模板标签不起作用
这是我实现的代码:
models.py:
class SalesRecord(models.Model):
name = models.CharField(max_length=100)
month = models.CharField(max_length=10)
revenue = models.IntegerField()
def __unicode__(self):
return self.name + " - " + self.month + " - " + str(self.revenue)
views.py:
def test(request, *args, **kwargs):
name = 'John'
monthly_sales_qs = SalesRecord.objects.filter(name=name)
print monthly_sales_qs
return render_to_response('test.html', locals())
mytags.py:
class DataForTag(template.Node):
@classmethod
def handle_token(cls, parser, token, template):
tokens = token.contents.split()
if tokens[1] != 'for':
raise template.TemplateSyntaxError("First argument in %r must be 'for'" % tokens[0])
if len(tokens) == 3:
return cls(queryset=parser.compile_filter(tokens[2]), template=template)
else:
raise template.TemplateSyntaxError("%r tag requires 2 arguments" % tokens[0])
def __init__(self, queryset=None, template=None):
self.queryset = queryset
self.template = template
def render(self, context):
return render_to_string(self.template, {'queryset':self.queryset})
@register.tag
def render_data_table(parser, token):
return DataForTag.handle_token(parser, token, 'testtable.html')
的test.html :
{% load mytags %}
{% render_data_table for monthly_sales_qs %}
testtable.html:
<table class="tabledata">
<tr>
{% for m in queryset.month %}
<td>queryset.revenue</td>
{% endfor %}
</tr>
</table>
模板会返回一个空白页面。在我看来,查询集是空的。 有人知道我做错了什么吗? (可能是一些新手的愚蠢;)
答
马克...
几件事情:我在匆忙的一天,当我张贴的代码为您服务。内render
方法变量需要解决这样...
def render(self, context):
qs = self.queryset.resolve(context)
return render_to_string(self.template, { 'queryset': qs })
此外,在您的模板,这是错误的:
{% for m in queryset.month %}
<td>queryset.revenue</td>
{% endfor %}
首先,变量需要被包裹在{{}}就像{{ queryset.revenue }}
,第二,你没有对m
值做任何事情,所以for
循环没有意义。
最后,我在django.contrib.comments
应用程序中找到的答案中显示了您的模式。如果你想遵循一些现有的/工作的例子,我建议查看评论模板标签。在那个应用程序中有很多很棒的点子。
Hi T Stone ....它现在有效! 非常感谢您的帮助....非常感谢 – Mark 2010-05-01 10:35:50