有没有一种方法可以在 Django 的同一个模板中呈现多个视图?

Posted

技术标签:

【中文标题】有没有一种方法可以在 Django 的同一个模板中呈现多个视图?【英文标题】:Is there a way we can render more than one view in same template in Django? 【发布时间】:2019-04-18 04:46:25 【问题描述】:

我正在 django 中启动一个数据分析项目,并希望在单个模板中显示从不同视图生成的文本数据和图形数据。这样做是一种好习惯,还是我应该为文本数据和图形数据排列两个不同的模板?

【问题讨论】:

不,您必须使用一个视图来呈现一页。但是您可以使用 iframe 从另一个视图加载上下文 从不同的视图生成是什么意思?您可以在视图中获取这两个数据并在一个模板中呈现它们 @grouchoboy .. 我想创建两个视图,一个用于文本数据,另一个用于图形数据,一个 html 文件用于显示文本数据和图形。我不明白该怎么做。 【参考方案1】:

这是可能的。视图负责根据请求创建响应并将其返回,并且可以使用任何有意义的方法来执行此操作。模板是这样做的一种工具,没有什么能阻止您在多个视图中使用给定的模板。如果您使用的是函数式视图,它可能看起来像这样:

def display_text(request):
    context = ...
    return render(request, "data.html", context)

def display_graph(request):
    context = ... # some different context than the text case
    return render(request, "data.html", context)

细节可能会有所不同 - 关键是没有任何东西将模板与一个视图联系起来。

这是否是一个好主意取决于您的两个案例之间共享了多少模板行为。一般来说,我建议将模板的共享部分分解为父模板,并使用template inheritance 专门针对不同数据类型的不同行为,而不重复共享部分。即使当前的显示行为是相同的,使用两个不同的模板也可以让您在将来想要更改时更容易。

如果单个模板可以真正处理这两种情况而无需确定数据类型是什么,并且您预计不会改变它,那么在两个视图中重用单个模板而不是创建类型可能是一个合理的选择 -具体的。

【讨论】:

【参考方案2】:

您可以使用一个基本模板,然后在该模板的一个块中显示数据

base_data.html

  some html
% block data %
% endblock %
   more html

text_data.html

% extends 'base_data.html' %

% block data %
   html to display the text data
% endblock %

graph_data.html

% extends 'base_data.html' %

% block data %
 html to display the graph data
% endblock %

views.py

def display_text_data(request):
    # your code
    return render(request, 'text_data.html', context)

def display_grapth_data(request):
    # your code
    return render(request, 'graph_data.html', context)

我不知道你是想要上面的,还是想要在一个 html 中显示两个,文本和图形,是第二个吗:

data.html

display text_data using textdata context

display graph data using graphdata context

views.py

def show_data(request):
    textdata = # get text data context
    graphdata = # get graph data context
    return render(request, 'data.html', context='textdata': textdata, 'graphdata': graphdata

【讨论】:

我可以创建一个视图和一个模板。但我很担心,因为它在一个视图中有这么多代码。这就是为什么我要求两个或多个视图和一个 html 文件同时显示来自视图的上下文。我没有得到答案,但感谢您抽出宝贵时间。

以上是关于有没有一种方法可以在 Django 的同一个模板中呈现多个视图?的主要内容,如果未能解决你的问题,请参考以下文章

Django:覆盖和扩展应用程序模板

AngularJS 与 Django - 模板标签冲突

AngularJS 与 Django - 冲突的模板标签

AngularJS 与 Django - 冲突的模板标签

从模板调用 html

Django:从模板中访问会话变量?