call self gettemplatesources and return a template object for the first template matching templatename if skip is provided ignore template origins in skip this is used to avoid recursion during template extending an iterator that yields possible matching template paths for a template name reset any state maintained by the loader instance e g cached templates or cached loader modules call self get_template_sources and return a template object for the first template matching template_name if skip is provided ignore template origins in skip this is used to avoid recursion during template extending an iterator that yields possible matching template paths for a template name reset any state maintained by the loader instance e g cached templates or cached loader modules
from django.template import Template, TemplateDoesNotExist


class Loader:
    def __init__(self, engine):
        self.engine = engine

    def get_template(self, template_name, skip=None):
        
        tried = []

        for origin in self.get_template_sources(template_name):
            if skip is not None and origin in skip:
                tried.append((origin, "Skipped to avoid recursion"))
                continue

            try:
                contents = self.get_contents(origin)
            except TemplateDoesNotExist:
                tried.append((origin, "Source does not exist"))
                continue
            else:
                return Template(
                    contents,
                    origin,
                    origin.template_name,
                    self.engine,
                )

        raise TemplateDoesNotExist(template_name, tried=tried)

    def get_template_sources(self, template_name):
        
        raise NotImplementedError(
            "subclasses of Loader must provide a get_template_sources() method"
        )

    def reset(self):
        
        pass