用多个子模板构建jinja/flask模板?

2024-06-28 19:41:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想设计一个网站,从数据库提供不同的数据视图。一般来说,我对jinja/flask和模板化还不熟悉,所以很有可能我走错了路,我在寻找一些反馈,或者“上帝不,你永远不会那样做”的反馈也很有效。:)

页面的基本结构是:一个带有快速链接的标题菜单,一个指向不同数据源的导航栏菜单,另一个导航栏下面提供不同的数据视图。视图的第二个导航栏将因初始导航栏中选择的选项而异。在

我设想的结构如下:

|-base.html (header menu)
|--navbar1.html (extends base.html, first navbar)
|---navbar2.html (and 3 and 4, etc. - extends navbar1)
|----data_view1.html (and 2, 3, etc. - the returned query, extends navbar2)

这将把每个html基本上看作一个框架,在我看来这是正确的方法,并使用变量来跟踪哪个导航栏选项在else块中高亮显示。在

虽然看起来很混乱,但实现上述目标的最佳方法是什么?它是否只是一个带有一系列elif的html文件,根据用户的选择显示navbar2/3/4和view1/2/3页面?在

提前致谢。在


Tags: and数据方法视图basehtml选项菜单
1条回答
网友
1楼 · 发布于 2024-06-28 19:41:18

你当然可以这样做,但很快就会变得复杂。更好的解决方案几乎可以肯定地将您的所有导航包括在一个文件中:

<nav class="top-navigation">
  <ul class="nav nav-first-level">
    {{ nav_entry("1st_ds", "1st Data Source", page, sub_page) }}
    {{ nav_entry("2nd_ds", "2nd Data Source", page, sub_page) }}
    {{ nav_entry("3rd_ds", "3rd Data Source", page, sub_page) }}
  </ul>
</nav>

{% macro nav_entry(identifier, title, page_id, sub_page_id) %}
  {% set attrs = {"class": "nav-selected"} if identifier == page_id else {} %}
  <li{{ attrs | xmlattrs }}><a href="#goes-somewhere">{{ title }}</a>
    <ul class="nav nav-second-level">
      <li{{ set_if_selected('1st_sub_entry', sub_page_id) }}>1st Sub-Entry</li>
      {# Other set_if_selected calls left off for clarity) #}
      <li>2nd Sub-Entry</li>
      <li>3rd Sub-Entry</li>
    </ul>
  </li>
{% endmacro %}

{% macro set_if_selected(identifier, to_match) %}
  {{ {"class": "nav-selected"} if identifier == to_match else {} | xmlattrs }}
{% endmacro %}

如果所有这些导航条目都是动态的,则更容易:

^{pr2}$

navigation可以像元组列表一样简单:

# Tuples are in the form
# (Link Title, URL, Is Selected?, Sub Menu Items)
# And sub menu items are tuples in the form
# (Link Title, URL, Is Selected?)
navigation = [("1st Data Source", "/some/url", true, []),
    ("2nd Data Source", "/some/url/2", false, [("A", "/a", false)]),
    ("3rd Data Source", "/some/url/3", false, [("B", "/b", false),("C", "/c", false)])]

nav_entry的更新作为练习留给读者:wink:

相关问题 更多 >