'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应用程序中找到的答案中显示了您的模式。如果你想遵循一些现有的/工作的例子,我建议查看评论模板标签。在那个应用程序中有很多很棒的点子。

+0

Hi T Stone ....它现在有效! 非常感谢您的帮助....非常感谢 – Mark 2010-05-01 10:35:50