Django - 如何在 base.html 中传递上下文?

Posted

技术标签:

【中文标题】Django - 如何在 base.html 中传递上下文?【英文标题】:Django - how to pass context in base.html? 【发布时间】:2018-12-28 09:00:20 【问题描述】:

我的 well_list.html 如下所示:

单击其中一行将转到此页面:

以上页面使用了两个html文件:base.html + contextual_main.html。 Base有侧边栏导航,后者是从base延伸出来的。在我的 views.py 中,我可以像这样轻松地将上下文数据传递到 contextual_main.html

views.py

class ContextualMain_DetailView(DetailView):
    template_name = 'contextual_main.html'
    context_object_name = 'single_well_info'
    model = models.WellInfo

contextual_main.html

<button type="button" class="btn btn-default" data-container="body" data-toggle="popover">
  <a href="% url 'contextual:bha' pk=single_well_info.api %">BHA</a>
</button>

我还需要将上下文 single_well_info 注入 base.html。所以我尝试以与 contextual_main.html 相同的方式注入它,但它不起作用。我该怎么做?

编辑---------------------------------------------- ----------------------

base.html:

  <body class="nav-md">
    <div class="container-fluid body">
      <div class="main_container">
        <!-- side bar -->
        <div class="col-md-3">
          <div class="left_col scroll-view">
            <!-- sidebar menu -->
            <div id="sidebar-menu" class="main_menu_side hidden-print main_menu">
              <div class="menu_section">
                <ul class="nav side-menu">
                  <li><a href="% url 'well_list' %"><i class="fa fa-list-ol"></i> Well List </a>
                  </li>
                  <li><a><i class="fa fa-bookmark"></i> My Wells </a>
                  </li>
                  <li><a><i class="fa fa-dashboard"></i> Dashboard </a>
                  </li>
                  <li><a><i class="fa fa-edit"></i> Contextual <span class="fa fa-chevron-down"></span></a>
                    <ul class="nav child_menu">
                      <li><a href="% url 'contextual:bha' pk=single_well_info.api %">BHA</a></li>
                      <li><a href="">Integrity Test</a></li>
                      <li><a href="">Casing</a></li>
                      <li><a href="">Cementing</a></li>
                      <li><a href="">Consumables</a></li>
                      <li><a href="">Daily Ops</a></li>
                      <li><a href="">Logging Data</a></li>
                      <li><a href="">Daily Cost</a></li>
                      <li><a href="">Mud</a></li>
                      <li><a href="">Equipments</a></li>
                      <li><a href="">Pumps</a></li>
                      <li><a href="">Survey</a></li>
                      <li><a href="">Time Log</a></li>
                      <li><a href="">Vol & Losses</a></li>
                      <li><a href="">Weather</a></li>
                      <li><a href="">Well Cond</a></li>
                      <li><a href="">Personnels</a></li>
                    </ul>
                  </li>
                  <li><a><i class="fa fa-clock-o"></i> Real Time <span class="fa fa-chevron-down"></span></a>
                    <ul class="nav child_menu">
                      <li><a href="">Operation</a></li>
                      <li><a href="">Beliefs and Alerts</a></li>
                      <li><a href="">Drilling Optimization</a></li>
                    </ul>
                </ul>
              </div>
            </div>
          </div>
        </div>
        <!-- /side bar -->

        <div class="right_container">
          <div class="container-fluid">
            % block content % % endblock %
          </div>
        </div>
      </div>
    </div>

  </body>

当我在 base.html 中编写编辑 &lt;a href=""&gt; 时,我的 PyCharm IDE 识别了 contextual:bha 参数,但它不识别 pk=single_well_info.api 参数,这就是问题所在。在我看来,当 base.html 通过 views.py 的 @987654332 扩展时,上下文没有注入到 base.html @调用

【问题讨论】:

在base.html中添加block并在块内添加上下文 @seuling 我不明白你在说什么,因为 base.html 已经有一个块,并且 contextual_main.htmlbase.html 内的块。上下文已经在块内注入,但上下文在块外不起作用。 因此您可以在导航中添加其他块。或者您可以添加自己的 context_processor 以将上下文发送到 base.html - 但您不必在其他页面中传递这些数据,对吧? 它应该可以正常工作。 “它不起作用”是什么意思?请从您的base.html 发布相关部分。 @Selcuk 请检查编辑 【参考方案1】:

您可能正在每个页面中扩展 base.html。因此,在您的每个视图函数/类中传递 single_well_info_context 绝对不是枯燥的。

您希望将 single_well_info 添加到您的上下文中,以使其在您的所有页面中可用。

您需要打开您的 settings.py 并向您的 TEMPLATE_CONTEXT_PROCESSORS 添加一个新上下文:

'context_processors': [
        ...
        # add a context processor
        'my_app.context_processor.single_well_info',

    ],

single_well_info 的功能类似于:

def single_well_info(request):
    return 
        'api':"Hello",
    

【讨论】:

我对这种方法的一个复杂情况是,single_well_info 应该与 views.pyContextualMain_DetailView 中的对象相同。如何确保 context_processor 中的 single_well_info 与我传递给 *contextual_main.html 的对象实例完全相同? 您需要根据请求或新参数调整您的函数def single_well_info(request):。请记住,为了帮助您,我们没有您的代码的大图。

以上是关于Django - 如何在 base.html 中传递上下文?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 的 base.html 中插入多个块?

如何将样式添加到 base.html:Django 框架?

如何在html文件中加载css文件已经在django中扩展了另一个html文件(base.html)

Django:在 django admin 中扩展 base.html

如何在不通过视图在所有页面中发送表单的情况下从 django 布局(如“base.html”)获取表单数据?

django cms - 如何使占位符可以从 base.html 继承