首页 > 解决方案 > 如何在基于 Django 类的视图中更改模板

问题描述

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

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. 或者也许有更简单的方法来实现相同的行为?

标签: djangodjango-viewsdjango-listview

解决方案


您可以覆盖.get_template_names()方法 [Django-doc],并返回匹配的模板名称,因此:

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

.get_template_names()应该返回一个可迭代的模板名称。如果模板不存在,Django 将通过列表进行枚举,从而呈现确实存在的可迭代对象的第一个模板。在这种情况下,我们可以返回一个单例列表,其中包含 Django 应该尝试呈现的唯一模板。


推荐阅读