Является ли Instance в шаблоне Django? - PullRequest
7 голосов
/ 22 августа 2011

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

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

Ответы [ 3 ]

8 голосов
/ 06 октября 2012

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

в 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

РЕДАКТИРОВАТЬ: Отредактировал ответ, чтобы показать, что аргумент фильтра на самом деле является строкой, а не классом Python

6 голосов
/ 22 августа 2011

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

0 голосов
/ 22 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...