Django模板中的IsInstance?

时间:2011-08-22 14:13:16

标签: django django-templates

有没有办法在Django模板中执行isinstance / issubclass?我意识到我可以编写自己的模板标签,但我很惊讶这不可能让我觉得我做错了什么或者遗漏了一些明显的东西。

我希望显示两个不同的标记段,具体取决于我在我的收藏中迭代时显示的项目类型。谢谢!

3 个答案:

答案 0 :(得分:8)

我认为这里的简单模板过滤器最适合。它实现起来非常快速且易于调用。像这样:

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类

答案 1 :(得分:6)

如果所有这些都继承自公共基类型,但您需要知道它是哪种类型,您可能只想在返回类型的基础上实现一个方法 - 然后您可以调用if foo.get_type == 'type1'(或模板中的任何内容。

答案 2 :(得分:-1)

你在这里遗漏了一些东西:模板中唯一的逻辑应该是处理模板渲染。 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模板引擎的设计考虑了非程序员,如设计师。