从单个视图提供多个模板(或者我应该使用多个视图?)

时间:2016-03-10 19:22:17

标签: python django django-templates

this post相关,我想从单个Django视图中填充多个HTML页面。这与我刚提到的链接之间的区别在于,我不希望它以编程方式为基础。我的模板上有链接,如" Reports"和其他公司特定的类别。如果用户点击“报告”链接,我想将他们带到一个新页面,向他们展示报告。这些数据都是相互关联的,所以我最初假设我会/应该对所有数据使用相同的视图。当我开始写这篇文章时,我开始想知道我是否应该为所有页面使用单独的视图。总共不应超过3-4页,具体取决于我希望如何拆分类别。

所以 TL; DR :我应该为模板中的每个HTML页面使用单独的视图,还是应该/可以使用单个视图来填充网站上的所有各个页面,即使大多数数据来自相同的来源?

2 个答案:

答案 0 :(得分:3)

使用基于类的视图的可能解决方案是创建一个基本视图类,该类将收集公共上下文数据,然后根据特定数据和模板的需要对其进行扩展。实际上,基类不必是View的扩展,ContextMixin扩展就足够了

基类应如下所示:

class BaseContextMixin(ContextMixin):

    def get_context_data(self, **kwargs):
        context_data = super(BaseContextMixin, self).get_context_data(**kwargs)
        common_data_1 = ...
        context_data["common_key_1"] = common_data_1
        common_data_2 = ...
        context_data["common_key_2"] = common_data_2
        ...
        return context_data

然后可以按如下方式实现视图:

class MyFirstView(TemplateView, BaseContextMixin):
    template_name = "mir/my_first_template.html"

    def get_context_data(self, **kwargs):
        context_data = super(MyFirstView, self).get_context_data(**kwargs)
        context_data["my_special_key"] = my_special_data
        return context_data

class MySecondView(TemplateView, BaseContextMixin):
    template_name = "mir/my_second_template.html"

    def get_context_data(self, **kwargs):
        context_data = super(MySecondView, self).get_context_data(**kwargs)
        context_data["my_special_key_2"] = my_special_data_2
        return context_data

这样可以避免冗余代码,同时可以保持结构简单

答案 1 :(得分:0)

我建议使用单独的视图,除非你想在整个过程中使用类似的格式化结构,否则你可能只使用一个视图。但即便如此,您也可以使用具有类似HTML结构的单独视图。这实际上取决于您希望如何构建文档。