IsInstance в шаблоне Django?

есть ли способ сделать isinstance / issubclass в шаблоне Django? Я понимаю, что могу написать свой собственный templatetag, но я удивлен, что это, возможно, не заставляет меня думать, что я делаю что-то неправильно или упускаю что-то очевидное.

Я хочу отобразить два разных сегмента разметки, в зависимости от того, какой тип элемента я отображаю во время итерации по моей коллекции. Спасибо!

3 ответов


Если все они наследуются от общего базового типа, но вам нужно знать, какой это тип, вы можете просто реализовать метод на базе, который возвращает тип - тогда вы можете вызвать if foo.get_type == 'type1' (или что-то еще) в вашем шаблоне.


Я думаю, что простой фильтр шаблонов здесь подходит лучше всего. Это действительно быстро реализовать и легко вызвать. Что-то вроде этого:--3-->

in 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 %}

хотя выше приведен пример кода (не протестирован), я считаю, что он должен работать. Дополнительные сведения о пользовательских фильтрах шаблонов см. В разделе в Django документация

EDIT: отредактировал ответ, чтобы показать, что аргумент фильтра на самом деле является строкой, а не классом python


вам чего-то не хватает: единственная логика в шаблоне должна обрабатывать рендеринг шаблона. 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 был создан с не-программистами, такими как дизайнеры, в разум.