Django模板中是否存在?

Django模板中是否存在?,django,django-templates,Django,Django Templates,有没有办法在Django模板中执行isinstance/issubclass?我意识到我可以编写自己的templatetag,但我很惊讶这不可能,这让我觉得我要么做错了什么,要么错过了一些明显的东西 我希望显示两个不同的标记段,这取决于我在集合上迭代时显示的项目类型。谢谢 这里缺少了一些东西:模板中唯一的逻辑应该是处理模板渲染isinstance/issubclass显然闻起来像视图逻辑,应该在视图中。如果模板呈现依赖于这些函数(我猜是这样的),那么应该在视图中实现逻辑,只需传递模板需要知道的内

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


我希望显示两个不同的标记段,这取决于我在集合上迭代时显示的项目类型。谢谢

这里缺少了一些东西:模板中唯一的逻辑应该是处理模板渲染
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 %}
#在视图中:
如果存在(某些对象,某些类):
do_fancy_template_stuff=真
其他:
do_fancy_template_stuff=False
#在模板中:
{%if do\u fancy\u template\u stuff%}
{%endif%}

请记住:django模板引擎是由非程序员(如设计师)创建的。

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

我认为这里的简单模板过滤器最适合。它实现起来真的很快,调用起来也很容易。大概是这样的:

在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 %}
在模板中:

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 %}
虽然上面是一个示例代码(未经测试),但我相信它应该可以工作。 有关自定义模板筛选器的详细信息,请参阅


EDIT:编辑了答案,以表明filter参数实际上是一个字符串,而不是python类

Hmmm,我大体上同意这种观点,但我不太确定我会走到这一步。我的用例是,我有一个项目集合,所有项目都是公共基类型,但在集合中是混合的。一个foo应该像这样显示,一个bar应该像那样显示,有点类似,但略有不同。它们要显示的字段稍有不同,因此显示片段也不同,所以很容易说{%if item.field\u that\u bars\u have%}或类似的,但这似乎很糟糕。我想正确的处理方法是创建一个自定义标记、呈现\u result\u item或一些可以选择正确显示片段的东西。这样,逻辑就不会出现在视图模板中,尽管代价是将其放在非程序员/设计师无法找到的地方。或者我可以写一个iInstance模板标签。或者我可以在模型中添加一个get_类型或其他内容。我现在漫无目的地说-谢谢你的回答:)。必须参考模型的完整路径使得这个解决方案对于后端的重构很脆弱,而且它需要模板/html设计器知道这些路径。如果你的团队分成后端程序员和模板设计师,这不是最好的方法。我完全同意。这里的目的是回答这个问题;这显然不是在模板中执行条件操作的最佳实践。