Мнение! Создаю фильтры шаблонов для работы с экземплярами классов в шаблонах, это работает, интересует наиболее "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
может быть инициализирован
как изменяемая структура данных, например, диктант.
И тогда как методы класса, так и обычные методы могут мутировать его.