【问题标题】:Django custom template tag with 'parser.compile_filter(tokens[2])' doesn't work带有“parser.compile_filter(tokens[2])”的 Django 自定义模板标签不起作用
【发布时间】:2010-04-30 16:56:59
【问题描述】:

我尝试实施 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())

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>

模板只是返回一个空页面。在我看来,查询集是空的。 有人知道我做错了什么吗? (可能是一些初学者的愚蠢行为;)

【问题讨论】:

    标签: python django templatetags


    【解决方案1】:

    标记...

    有几件事:前几天我为您发布代码时很着急。 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 应用程序中找到的答案中向您展示的模式。如果您想遵循一些现有/工作示例,我建议您查看 cmets 模板标签。该应用中有很多很棒的想法。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2014-01-28
      • 2014-06-27
      • 2011-01-06
      • 2011-01-02
      • 2021-07-13
      • 2015-01-20
      • 2014-03-04
      相关资源
      最近更新 更多