2010-04-30 83 views
2

我試着實現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> 

模板會返回一個空白頁面。在我看來,查詢集是空的。 有人知道我做錯了什麼嗎? (可能是一些新手的愚蠢;)

回答

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應用程序中找到的答案中顯示了您的模式。如果你想遵循一些現有的/工作的例子,我建議查看評論模板標籤。在那個應用程序中有很多很棒的點子。

+0

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

相關問題