有没有办法在Django模板中做isinstance/issubclass?我意识到我可以编写自己的模板标签,但我很惊讶这不可能,这让我认为我要么做错了什么,要么遗漏了一些明显的东西。
我希望显示两个不同的标记段,这取决于我在集合上迭代时显示的项的类型。谢谢!
发布于 2011-08-22 23:11:08
如果所有这些都继承自一个公共基类型,但您需要知道它是哪种类型,那么您可能只想在返回该类型的基类型上实现一个方法-然后您可以在模板中调用if foo.get_type == 'type1' (或其他任何类型)。
发布于 2012-10-07 03:08:29
我认为这里的一个简单的模板过滤器最适合。它实现起来真的很快,而且很容易调用。如下所示:
templatetags/my_filters.py中的:
from django import template
from django.utils.importlib import import_module
register = template.Library()
@register.filter
def isinst(value, class_str):
split = class_str.split('.')
return isinstance(value, getattr(import_module('.'.join(split[:-1])), split[-1]))模板中的:
{% load my_filters %}
...
{% if myvar|isinst:"mymodule.MyClass" %}
...do your stuff
{% endif %}虽然上面是一个示例代码(未经过测试),但我相信它应该可以工作。有关自定义模板筛选器的详细信息,请参阅the django documentation
python编辑:编辑了答案,以显示过滤器参数实际上是一个字符串,而不是类
发布于 2011-08-22 22:17:06
这里您遗漏了一些东西:模板中唯一的逻辑应该是处理模板呈现。isinstance / issubclass显然闻起来像是视图逻辑,应该在视图中。如果模板渲染依赖于这些函数(我猜确实如此),那么您应该在视图中实现逻辑,并将模板需要知道的内容传递给它:
# in the view:
if isinstance(some_obj, SomeClass):
do_fancy_template_stuff = True
else:
do_fancy_template_stuff = False
# in the template:
{% if do_fancy_template_stuff %}
<fancy_template_stuff />
{% endif %}记住: django模板引擎的创建考虑到了非程序员,比如设计师。
https://stackoverflow.com/questions/7148792
复制相似问题