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