详解Django的 get_template_names() 函数:获取视图所使用的模板名称

  • Post category:Python

get_template_names()是Django中TemplateView类中的一个方法,用于指定加载模板的顺序。当我们通过URL访问一个视图函数,并指定template_name属性,Django会按照一定的顺序去寻找模板文件。而这个顺序,就是通过get_template_names()方法得到的。

在默认情况下,get_template_names()方法会按照以下顺序寻找模板文件:

  1. 根据template_name属性直接寻找相应文件
  2. 如果template_name属性未指定,则默认加载相应应用下的<app_label>/<model_name>_<view_name>.html模板
  3. 如果以上两个方法均失败,则默认加载相应应用下的<app_label>/<view_name>.html模板

我们也可以通过重写get_template_names()方法来定制模板文件的加载顺序。例如,我们想按照特定的顺序寻找模板文件,可以这样实现:

class MyView(TemplateView):
    def get_template_names(self):
        return [
            "app1/template1.html",
            "app2/template2.html",
            "app3/template3.html"
        ]

上述代码中,我们通过重写get_template_names()方法,将模板文件寻找顺序改为了先寻找app1/template1.html,然后再寻找app2/template2.html,最后才寻找app3/template3.html

另外,我们也可以传入参数到get_template_names()方法中来控制模板文件的加载顺序。例如:

class MyDetailView(TemplateView):
    model = MyModel

    def get_template_names(self):
        names = super().get_template_names()
        names.insert(0, 'prefix_%s.html' % self.object.type)
        return names

上述代码中,我们重写了MyDetailView类中的get_template_names()方法。在该方法中,我们通过函数super().get_template_names() 获取到默认的模板名,然后我们在默认的模板名数组的第一项,插入了一个新的模板文件名——prefix_%s.html,其中,%s会被替换为self.object.type的值。

这样,当我们访问MyDetailView时,首先会尝试去加载prefix_%s.html这个模板文件,如果这个文件不存在,则依次尝试加载myapp/mymodel_detail.htmlmyapp/my_detail.html等默认模板文件。

总之,通过get_template_names()方法,我们可以控制Django如何去寻找并加载模板文件,从而实现对模板的定制和控制。