比方说,我想为动态计数器创建一个简单的模板标签,如何为{{ request.user }}
author
的{{1}}内部值注入一个示例?
我的主意是{{ 'blog.model.Post'|counter:"{'author':'...?'}" }}
,但当然它应该返回{{ '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
? 因为我使用这种方法来提供仅专注于模板标签的插件。
答案 0 :(得分:0)
也许,这种情况的最佳方法不是模板标签,是@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 }}