2017-02-15 85 views
0

說吧,我想創建一個簡單的模板標籤爲動態計數器,我怎樣才能注入一個例子{{ request.user }}內部值author{{ 'blog.model.Post'|counter:"{'author':'...?'}" }}Django templatetags:過濾器內的對象

在我的壞主意,{{ 'blog.model.Post'|counter:"{'author':'request.user'}" }},但當然它應該返回字符串'request.user',但不是實際的對象。

import ast 
from django import template 
from django.utils.module_loading import import_string 

register = template.Library() 

@register.filter 
def counter(model_name, filter=None): 
    """ 
    by all objects: 
     {{ 'yourapp.model.ClassName'|counter }} 

    by filter objects: 
     {{ 'yourapp.model.ClassName'|counter:"{'field_name':'value'}" }} 
     > example: 
     {{ 'blog.model.Post'|counter:"{'author':'...?'}" }} 
    """ 
    model = import_string(model_name) 
    if filter is not None: 
     filter_dict = ast.literal_eval(filter) 
     return model.objects.filter(**filter_dict).count() 
    return model.objects.count() 

作爲一個說明;爲什麼我不把它處理成models.pyviews.py? 因爲我使用這種方法來提供我的插件,只專注於模板標籤。

+0

你不會做這在所有;這對於模板來說太多了。只是你必須做'literal_eval'應該是一個紅旗。 –

+0

你能告訴我一個想法嗎? –

+0

這屬於視圖中。 –

回答

0

也許,在這種情況下,最好的辦法是不是templatetag,是一個@property:

class foo(models.Model): 
    foo_date = models.DateTimeField(null=True) 

    @property 
    def get_foo_count(self): 
     ...some code ... 
     return 1 

您可以從模板調用propertys。

如果你仍然想使用templatetags:

上templatetag:

@register.simple_tag 
def get_foo_count(foo): 
     return 1 

模板:

{% load foo_templatetags %} 
{% get_foo_count foo as foo_count %} 

{{ foo_count }} 
+0

我知道了,我只是提供這個[我的插件](https://github.com/agusmakmun/common-tags/blob/master/common/templatetags/common_tags.py#L103-L119)不適合我的項目。所以,這就是爲什麼我創建了一個動態計數器... –