如何在基于 Django class 的视图中更改模板

How to change template in Django class based view

如果我有一个基于 class 的视图,例如:

class equipmentdashboardView(LoginRequiredMixin,ListView):
    context_object_name = 'equipmentdashboard'
    template_name = 'equipmentdashboard.html' 
    login_url = 'login'

    def get_queryset(self):
        #some stuff

如何根据查询更改 template_name?我想做类似的事情:

class equipmentdashboardView(LoginRequiredMixin,ListView):
    context_object_name = 'equipmentdashboard'
    if self.request.user.PSScustomer.customerName == 'Customer X':
        template_name = 'equipmentdashboard_TL.html' 
    else:
        template_name = 'equipmentdashboard.html' 
    login_url = 'login'

    def get_queryset(self):
            #some stuff

但是您无法访问get_queryset之前的请求。 或者也许有更简单的方法来实现相同的行为?

您可以覆盖 .get_template_names() method [Django-doc] 和 return 匹配的模板名称,因此:

class equipmentdashboardView(LoginRequiredMixin,ListView):
    context_object_name = 'equipmentdashboard'
    login_url = 'login'
    
    def <strong>get_template_names</strong>(self):
        if self.request.user.PSScustomer.customerName == 'Customer X':
            return ['equipmentdashboard_TL.html']
        else:
            return ['equipmentdashboard.html']

.get_template_names() 应该 return 一个 可迭代的 模板名称。如果模板不存在,Django 将遍历列表,从而呈现第一个存在的可迭代模板。在这种情况下,我们可以 return 一个单例列表,其中包含 Django 应该尝试呈现的唯一模板。