Python 我可以在基于Django类的视图中使用函数来确定模板名称吗?

Python 我可以在基于Django类的视图中使用函数来确定模板名称吗?,python,django,django-views,django-templates,Python,Django,Django Views,Django Templates,我正在尝试将基于函数的视图转换为基于类的视图,以便在Django3应用程序中清理一些东西。我在使用get_context_数据时没有遇到任何问题,但我不知道如何确定模板名称,因为它通常是由变量确定的: 从基于函数的视图中: def tour_page(request, page_safe_name, tour_id): site_name = request.META['HTTP_HOST'] s = Site.objects.get(domain=site_name)

我正在尝试将基于函数的视图转换为基于类的视图,以便在Django3应用程序中清理一些东西。我在使用get_context_数据时没有遇到任何问题,但我不知道如何确定模板名称,因为它通常是由变量确定的: 从基于函数的视图中:

def tour_page(request, page_safe_name, tour_id):
    site_name = request.META['HTTP_HOST']
    s = Site.objects.get(domain=site_name)
    t = Tour.objects.get(pk=tour_id)
    page_location = 'tours/' + t.tour_safe_name + '/' + page_safe_name + '.html'
    ...
    return render(request, page_location, context)
所以。。。。我可以用一个基于函数的视图很容易地做到这一点。对于在基于类的视图中我可以(甚至应该?)在哪里这样做,我有点困惑。我读过一些关于分派和潜在重写get。。。但我不能100%确定我应该在哪里做这件事,特别是因为我在上下文中做了一些处理:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    site_tour_data, s, t = self.get_site_tour_data()

    context.update(
        {
            'site_safe_name': s.site_safe_name,
            'site_name': s.site_name,
            'site_tour_data': site_tour_data,
            'tour_name': t.tour_safe_name,
            'tour_id': t.id,
            'domain': s.domain,
        }
    )
    return context
是否有一种方法可以从上下文中获取它,或者在加载特定页面时在其他地方处理这些内容?其他视图都很好,因为它们有更简单的模板名称。。。对一些显示基本html的更基本的页面使用单独的视图感觉很傻。如果我能做像这样的事情,那就太棒了

template_name = 'tours/' + self.t.tour_safe_name + '/' + self.page_safe_name + '.html'

但这不是一件事

好的-我可以将其保留为templateview(它实际上与rest没有任何关系……tour_id只是文件夹的一个标记,用于帮助进行白色标记)

这就像覆盖get_模板名称一样简单。。。我想我已经试过了,但也许我累了。谢谢你,伊恩

def get_template_names(self):
    site_tour_data, s, t = self.get_site_tour_data()
    template_name = 'tours/' + t.tour_safe_name + '/' + self.kwargs['page_safe_name'] + '.html'
    return (template_name,)

好的-我可以将其保留为templateview(它实际上与rest没有任何关系……tour_id只是文件夹的一个标记,用于帮助进行白色标记)

这就像覆盖get_模板名称一样简单。。。我想我已经试过了,但也许我累了。谢谢你,伊恩

def get_template_names(self):
    site_tour_data, s, t = self.get_site_tour_data()
    template_name = 'tours/' + t.tour_safe_name + '/' + self.kwargs['page_safe_name'] + '.html'
    return (template_name,)

您使用的是
DetailView
?问得好!TemplateView如果使用DetailView或SingleObjectMixin,则可以通过self.objectI访问get_template_names方法中的tour对象。我应该注意-这与模型无关(尽管使用模型拉取特定的tour文件夹)。不过,这不是一个坏主意。。。让我来玩吧。我猜它是如此的脱离模型,我拒绝这样想。。。谢谢您使用的是
DetailView
?问得好!TemplateView如果使用DetailView或SingleObjectMixin,则可以通过self.objectI访问get_template_names方法中的tour对象。我应该注意-这与模型无关(尽管使用模型拉取特定的tour文件夹)。不过,这不是一个坏主意。。。让我来玩吧。我猜它是如此的脱离模型,我拒绝这样想。。。谢谢