【问题标题】:web.py and how to use section blocksweb.py 以及如何使用部分块
【发布时间】:2016-11-28 19:17:27
【问题描述】:

我将 web.py 模板用于我的项目并使用 render('templates', base="") 我将基本布局与页面特定布局(简化)结合起来。

view.py
render = web.template.render('templates',base='layout')
return render.index()

共享布局文件

layout.html
$def with (content)
<html>
<head>
<title>$content.title</title>
</head>
<body>
$:content
</body>
</html>

页面特定模板

index.html
$def with (values)
$var title: Hello Kitty
<p>Hello $values, how are you doin?</p>

我正在寻找的解决方案是如何实现以下

login.html
$def with (values)
$var title: Enter credentials

<form>
<p><input type="text" name="user_name"></p>
<p><input type="password" name="user_pwd"></p>
<p><button type="submit">Open the gates</button></p>
</form>

$block_begin
<script>
// When the form is submitted, check the required fields and inform user
// if any data is missing or looks weird
</script>
$block_end

</body>
</html>

我的问题是,如何将脚本添加到 login.html 模板而不是 index.html 模板?我对必须将所有 JS 逻辑添加到所有页面不感兴趣,我想添加这个 $block_begin/$block_end 以便它像这样出现在 layout.html 的底部

layout.html
$def with (content)
<html>
<head>
<title>$content.title</title>
</head>
<body>
$:content

$block_begin
$block_end
</body>
</html>

$block_begin/$block_end 只是我想出的更好地解释自己的东西。

【问题讨论】:

    标签: python web.py


    【解决方案1】:

    需要明确的是,template -&gt; defwith sections 是语法,而不是示例。要使用模板,请查看 http://webpy.org/docs/0.3/templetor 以获取示例。

    在高层次上,您创建的模板类似于

    === templates/index.html ===
    $def with(values)
    $var title: Hello Kitty
    <p>Hello $values, how are you doin?</p>
    
    === templates/layout.html ===
    $def with(content)
    <html>
     <head>
      <title>$content.title</title>
     </head>
     <body>
      $:content
     </body>
    </html>
    

    然后在你的python中你渲染模板,传入模板中指定的任何参数。 (在本例中为“values”。)命名模板 (index.html) 使用基础 (layout.html) 渲染,正如您所发现的,content 包含渲染的内部位(索引的结果) 并被插入到基本模板布局中。

    您问的是如何将一些脚本放入 login.html,而不是 index.html,这很简单:只需将 javascript 代码添加到 login.html 模板中。

    === login.html ===
    $def with (values)
    $var title: Enter credentials
    <form>
    ...
    </form>
    <script>
      window.addEventListener('load', function () {
         // whatever javascript you want to execute on load.
         // If using jQuery, you'll have to use $$('form') or jQuery('form') rather
         // than $('form'), as dollar signs are special within the template.
      });
    </script>
    

    更聪明的东西?更充分地使用content。您在模板中使用 $var 定义的任何内容都会放入基本布局中的 $content

    如果您只想在您的login.html 页面被渲染时包含login.js,您可以简单地创建一个新的内容属性。在 login.html 中:

    $var extra_js: js/login.js
    

    然后,在您的布局文件中有条件地加载底部的值(我们喜欢加载脚本的地方)。

    === templates/layout.html ===
    ...
    <body>
      $:content
      $if content.get('extra_js', None):
          <script type="text/javascript" src="$content.extra_js"></script>
    </body>
    </html>
    

    您可以使您的 layout.html 越来越强大,参数化元数据、脚本、css 文件等。就像您对 $content.title 所做的那样,让您的各个模板文件驱动整个布局的不同部分。

    【讨论】:

    • 我在做什么。但我想要的是在布局文件中定义一个块,然后我可以根据视图加载器添加内容。就像 Django 模板和 Jinja 一样,但我想坚持使用 web.py 的模板而不是切换。所以问题是,是否支持该功能
    • 我确信这是可能的,但我不明白你试图做什么,但它不起作用。 web.py 模板不需要或不需要 {% %} 块,因为您可以直接将 javascript 添加到模板中。 (&lt;script src=...&gt;&lt;/script&gt;&lt;script&gt;var foo="bar";&lt;/script&gt;)。你能提供更多关于你想要做什么的细节吗?
    • 例如common-look-and-feel,是通过在render中使用base=来完成的。您可以通过直接在模板中调用render 来让模板调用/加载其他模板(毕竟是python)......我认为这可能是您正在寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多