django/contrib/admin/templatetags/base.py
from inspect import getfullargspec
from django.template.library import InclusionNode, parse_bits
class InclusionAdminNode(InclusionNode):
"""
Template tag that allows its template to be overridden per model, per app,
or globally.
"""
def __init__(self, parser, token, func, template_name, takes_context=True):
self.template_name = template_name
params, varargs, varkw, defaults, kwonly, kwonly_defaults, _ = getfullargspec(
func
)
bits = token.split_contents()
args, kwargs = parse_bits(
parser,
bits[1:],
params,
varargs,
varkw,
defaults,
kwonly,
kwonly_defaults,
takes_context,
bits[0],
)
super().__init__(func, takes_context, args, kwargs, filename=None)
def render(self, context):
opts = context["opts"]
app_label = opts.app_label.lower()
object_name = opts.model_name
# Load template for this render call. (Setting self.filename isn't
# thread-safe.)
context.render_context[self] = context.template.engine.select_template(
[
"admin/%s/%s/%s" % (app_label, object_name, self.template_name),
"admin/%s/%s" % (app_label, self.template_name),
"admin/%s" % self.template_name,
]
)
return super().render(context)