我可以在 Web2Py 中包含部分视图,将特定变量传递给它吗?

Posted

技术标签:

【中文标题】我可以在 Web2Py 中包含部分视图,将特定变量传递给它吗?【英文标题】:Can I include partial view in Web2Py, passing specific variables into it? 【发布时间】:2012-03-12 20:49:58 【问题描述】:

我有时需要使用Web2Py 中的部分视图,但我需要将一些特定的变量传递给它们。在 Django 中,它看起来像这样:

% include "image.html" with caption="Me" source="http://example.com/img.png" %

对于 Web2Py,我可以执行以下操作:

 include "image.html" 

但在the documentation 中甚至没有提到将变量传递给部分视图(或者我遗漏了一些非常明显的东西)。

这方面的用例是降低视图的复杂性(并实现 DRY 规则)并在循环中显示一些复杂的内容(例如图像、复杂的容器等)。

我不想改用我自己的标签/函数——我需要一些快速简单的东西,只是为了包含带有特定变量的局部视图。类似地,它可以在 Django 或许多其他 Web 框架中完成。它甚至可能吗,或者由于 Web2Py 的架构,它是相当不可能/费力的?

请告诉我这在 web2py 中是否可行,或者我是否应该创建自己的标签以在视图中使用它(如果可以,最简单/最简单的方法是什么?)。

谢谢。

【问题讨论】:

【参考方案1】:

Interrobang 的回答是正确的——控制器返回的变量即使在包含的(以及扩展的)视图中也是可用的。所以,你可以这样做:

在 mycontroller.py 中:

def myfunc():
    return dict(caption='Me', source='http://example.com/img.png')

然后在 /views/mycontroller/myfunc.html:

include 'image.html'

在这种情况下,captionsource 将在 image.html 视图中可用。而不是从控制器返回captionsource,另一种选择是在include 指令之前的视图中定义它们:

caption = 'Me'
  source = 'http://example.com/img.png'
include 'image.html'

【讨论】:

谢谢,安东尼。这就是我所需要的,我忘记了 web2py 的隐含性质。但我有个问题。如果我在某个控制器的操作中渲染某个视图(例如,用于通过 AJAX 或进一步处理),然后按照您的建议在视图中定义一个变量,它是否可以在操作主体中访问(在视图渲染之后,但是在通过操作返回值之前)?同样正如我所假设的,在任何视图中重新分配的传递变量在那之后执行的任何视图中都会改变值?有命名空间吗? 否,视图中定义的变量将无法在呈现视图的操作中访问。当您调用response.render() 时,它会在新环境中执行视图,因此控制器环境不受影响。你对在视图中重新分配变量是正确的。渲染视图时,扩展视图和包含视图之间没有命名空间。原因是扩展视图和包含视图首先组合,然后作为一个视图执行(这就是为什么在 includeextend 之前定义的对象在包含或扩展视图中可用)。【参考方案2】:

来自the book:

还值得指出的是,返回的变量 控制器功能不仅在功能的主 视图,但在其所有扩展和包含视图中也是如此。

除非我误解了您的问题,否则您不必专门传递变量,而是照常使用它们。

【讨论】:

【参考方案3】:

详细说明安东尼的回答, 如果您需要传递给视图的其他变量,只需将它们包含在返回字典中。 在我当前的项目中,我传递了一大堆要在视图中使用的变量。

return dict(maxsize=5, message='hello world', fadetimeout=10, warning=0)

此外,如果您需要访问网络中多个视图中的某些值,您可以将它们存储在会话中。

session.some_var_i_need_in_multiple_views = ['one', 'two', 'three']

然后在视图中访问它:

=H3(session.some_var_i_need_in_multiple_views[0])

【讨论】:

我真的不喜欢你可以在视图中做的事情,因为你期待例如。会话变量在那里被改变。感谢您的回答,问题是关于局部视图 - 我忘记了变量被隐式传递到 web2py 中的局部视图,而不是我知道的大多数 Python 和 php 框架。

以上是关于我可以在 Web2Py 中包含部分视图,将特定变量传递给它吗?的主要内容,如果未能解决你的问题,请参考以下文章

Rails-覆盖在使用部分或特定控制器视图时的页面元素

如何在正则表达式中包含变量[重复]

如何在 cx_freeze 中包含一个文件夹?

如何在 cx_freeze 中包含一个文件夹?

如何在 cx_freeze 中包含一个文件夹?

如何在 cx_freeze 中包含一个文件夹?