【发布时间】:2020-10-01 20:22:10
【问题描述】:
我正在尝试将基于函数的视图转换为基于类的视图,以清理 Django 3 应用程序中的一些内容。我使用 get_context_data 工作没有问题,但我不知道如何确定我的 template_name,因为它通常由变量确定: 从基于函数的角度来看:
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)
所以....我可以很容易地使用基于函数的视图来做到这一点。我对在基于类的视图中我可以(甚至应该?)执行此操作感到有些困惑。我已经阅读了一些关于 dispatch 和可能覆盖 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'
但这不是一回事
【问题讨论】:
-
你在使用
DetailView吗? -
好问题!模板视图
-
如果您使用 DetailView 或 SingleObjectMixin,您可以通过 self.object 在 get_template_names 方法中访问游览对象
-
我应该注意 - 这与模型无关(尽管模型用于拉出特定的游览文件夹)。
-
这不是一个坏主意,不过……让我来试试吧。我想它与模型如此分离,我拒绝这样思考......谢谢!
标签: python django django-views django-templates