2017-02-15 4 views
0

たとえば、ダイナミックカウンタ用のtemplatetagsを作成するには、{{ 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.pyまたはviews.pyに扱っていないのですか? 私はこのメソッドを使用して、templatetagsのみに焦点を当てたプラグインを提供しています。

+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)のためにこれを提供する。私はダイナミックカウンタを作ったのですが... –

関連する問題