2017-02-15 91 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)不适合我的项目。所以,这就是为什么我创建了一个动态计数器... –