Opinion! Creating Template filters to work with class instance in templates, this works, wondering the most "django" optimal way?

Accessing class methods in templates, this works but was wondering if their was a better way?

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()

in template, lets say content is a class instance

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

Yikes!

Don't do that.

The Turing machine you describe has well-defined semantics. But python engineers don't write such code, because it leads to maintenance headaches.

Python is all about namespaces.

There is a global namespace, which Something is in.

There is a class namespace which, ever since the Something class was defined (at parse time) has a somevar attribute with value None.

Later on, at run time, we create a pair of objects with self.somevar values of 1 and 2. But the class attribute is still None.

This is perfectly well defined. The machine won't become confused. But you or future maintenance engineers very likely will.

Choose a different name for the class attribute, please. Reference it as Something.somevar, or as cls.somevar from within a @classmethod.


Notice that class attribute somevar can be initialized as a mutable data structure, such as a dict. And then both classmethods and ordinary methods can mutate it.

Back to Top