Skip to main content
 首页 » 编程设计

python之带有 'parser.compile_filter(tokens[2])' 的 Django 自定义模板标签不起作用

2025年05月04日25rubylouvre

我尝试实现 T. Stone 针对我的问题“how-do-i-pass-a-lot-of-parameters-to-views-in-django”提出的解决方案([链接文本][1] ).
我无法得到任何结果。很难找到有关 compile_filter() 的信息,但据我了解 cls(queryset=parser.compile_filter(tokens[2]), template=template) 应该使用“可变”标记 [2] 呈现模板。但这似乎不起作用。

下面是我的实现代码:
模型.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()) 

我的标签.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') 

测试.html:

{% load mytags %} 
{% render_data_table for monthly_sales_qs %} 

测试表.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 应用程序中找到的答案中向您展示的模式。如果您想遵循一些现有/工作示例,我建议您查看评论模板标签。该应用程序中有很多很棒的想法。