将views.py中的视图合并到一个视图中?

时间:2019-11-29 00:19:41

标签: django django-templates

我正在构建一个项目,在我的views.py中有几个视图,希望以仪表板格式合并(四个视图并排)。它们之所以足够复杂,是因为每个视图都包含许多变量并且具有很多逻辑服务器端,我也打算单独在其他地方使用它们。

我要问的是如果要创建仪表板视图(即,我有一个带有标题的基本模板),是将views.py中的单独视图合并到单个视图中的最佳方法是什么 / footer,然后在该基础中嵌入4个视图。

我的概念证明是使用正确的变量调用视图并解码呈现的返回值,然后将其作为变量传递到模板上,最后将其作为安全代码插入。见下文。我的直觉告诉我这是一种糟糕的做法,但是我不确定include / extends系统是否适合这种用途。

views.py

def view1(request, r1_level, r2_level, d_level, call_code):
    ...
    return render(request,
        'modules/logic/levels/' + call_code + '.html',
        {
            'indicators': indicators,
            'd_level': d_level,
            'prof': prof,
            'a_flag': a_flag
        }
    )

def dashboard(request, level_code):
    view1 = view1(request, r1_level, r2_level, d_level, call_code).content.decode("utf-8")
    ...

    return render(request,
        'dashboard.html',
        {
            'view1': view1,
            ...
        }
    )

dashboard.html

<div id="site-wrapper" class="content">
  <div class='grid-container'>
    <div class="grid-x grid-margin-x">

      <div class="cell small-12 medium-6 large-8">
        ...
      </div>

      <div class="cell small-12 medium-6 large-4">
        {{ view1 | safe }}
      </div>

    </div>
  </div>
</div>

感谢您阅读这份烂摊子!

1 个答案:

答案 0 :(得分:0)

您可以尝试做些什么,但是您需要做一些变通的工作。

views.py

def build_view1_data(): # not a view, just a helper function
    dict = {}
    ... build logic here ...
    return dict

def dashboard_view(request):
    context_dict = {
        'view1': build_view1(),
        .... etc.
    }

    return render(request, 'template.html', context_dict)

然后,您可以使用{{view1.somedata}}访问模板中的所有view1数据。此外,当您要实际构建view1时,可以执行与上述相同的操作,并调用build_view1_data函数。

您还可以构建模板,以便可以在仪表板模板和view1模板中添加类似的内容。

dashboard.html

 {% include 'view1.html' %}

那样,您只需要编写一次。