Мнение! Создаю фильтры шаблонов для работы с экземплярами классов в шаблонах, это работает, интересует наиболее "django" оптимальный способ?

Получение методов класса в шаблонах, это работает, но хотелось бы узнать, есть ли лучший способ?

someclass

class Something():
    somevar = None
    def __init__(self, somevar):
        self.somevar = somevar
    
    def set_somevar(self, newvar):
        self.somevar = newvar
    
    def set_weird_and_somevar(self, weird, somevar):
        self.weird = weird
        self.somevar = somevar
    
    def get_tag(self, tag):
        
    

templateTag

from django import template
register = template.Library()

@register.filter
def class_get_method(value, method):
    f = method.split('.')
    method = f[0]
    del f[0]
    p = getattr(value, method)
    if f:
        return p(*f)
    else:
        return p()

в шаблоне, допустим, содержимое является экземпляром класса

{{content|class_get_method:'set_weird_and_somevar.wenday_adams.nothervar'}}
class Something():
    somevar = None
    def __init__(self, somevar):
        self.somevar = somevar

Yikes!

Не делай этого.

Описанная вами машина Тьюринга имеет вполне определенную семантику. Но инженеры python не пишут такой код, потому что это приводит к головной боли при обслуживании.

Python - это все о пространствах имен.

Существует глобальное пространство имен, в котором находится Something.

Существует пространство имен класса, который, с момента определения класса Something (во время разбора) имеет атрибут somevar со значением None.

Позже, во время выполнения, мы создаем пару объектов со значениями self.somevar 1 и 2. Но атрибут class по-прежнему None.

Это прекрасно определено. Машина не запутается. Но вы или будущие инженеры по техническому обслуживанию, скорее всего, запутаются.

Выберите другое имя для атрибута class, пожалуйста. Ссылайтесь на него как Something.somevar, или как cls.somevar внутри @classmethod.


Обратите внимание, что атрибут класса somevar может быть инициализирован как изменяемая структура данных, например, диктант. И тогда как методы класса, так и обычные методы могут мутировать его.

Вернуться на верх