【问题标题】:Web2py mapping controller to viewWeb2py映射控制器查看
【发布时间】:2015-03-26 21:44:10
【问题描述】:

只是想知道是否有人可以在此处为 web2py 应用程序指明正确的方向。到目前为止,我有 2 个控制器,但我会使用更多。我拥有的 2 个是 index.pydiary_manager.py

index.py 目前返回一个空字典,并在myapp/views/index/ 目录中公开index.html 视图。在index.html中,用户可以点击界面中带有href属性的按钮,如下:

<a href="{{=URL(c="diary_manager", f="diary_manager")}}">Diary</a>

如果我单击该链接,它将调用diary_manager.py 控制器中的diary_manager 函数。到目前为止一切都很好。

现在这是我遇到问题的地方。如果我从diary_manager 函数返回一个dict,我必须将相应的视图放在myapp/views/diary_manager/ 目录中,这将被暴露。另一方面,如果我不返回 dict,我根本无法公开视图。

所以我有几个问题:

  1. 为什么我在返回dict时必须在视图中创建与控制器名称匹配的目录名称?

  2. 有没有办法阻止这种情况,以便我可以将所有视图直接放入视图目录中?

  3. 如何强制不返回 dict 的控制器打开特定视图?

我希望所有这些都清楚!

【问题讨论】:

  • 如果你的函数是diary_manager,那么你对应的视图应该是myapp/views/diary_manager而不是myapp/views/diarymanager
  • @JoeR 你确实是对的,这是我的错字

标签: python model-view-controller web2py


【解决方案1】:
  1. 为什么当我返回一个dict时,我必须在视图中创建一个与控制器名称相匹配的目录名称?

您不必这样做。这只是一个约定,因此您不必为每个操作显式指定关联视图的位置。如果您不喜欢这种约定,您可以将视图放置在您想要的任何位置并根据需要命名它们,但是您必须为每个操作显式指定视图。

  1. 有没有办法阻止这种情况,以便我可以将所有视图直接放入 views 目录?

是的,您可以设置自己的约定,然后包含代码以根据某些规则设置response.view 的值。例如,假设您将所有视图文件放在顶级/views 目录中,并使用模式[controller]_[function].[extension] 命名它们。在这种情况下,您可以在模型文件中包含以下行:

response.view = '%s_%s.%s' % (request.controller, request.function,
                              request.extension)

如果上述代码在模型文件中,它将在每个请求上执行,因此它将为每个控制器/动作正确设置视图文件。

  1. 如何强制不返回 dict 的控制器打开特定视图?

为什么需要这样做?如果您没有要返回的内容而只是想执行一个视图,那么您可以返回一个空字典。

或者,您的函数可以直接渲染视图并返回渲染的输出:

def myfunction():
    [some code]
    return response.render()

response.render() 可选地采用第一个参数,即视图文件名,以及第二个参数,即视图环境中可用的变量字典。

【讨论】:

    【解决方案2】:
    1. 我想 MVC 概念的整个想法是让你的生活更轻松,只要你遵守一些规则。

    2. 您可以设置 response.view 的值。此外,还有一个“重定向”。

    3. 你不能。仅当操作返回字典时才会调用视图(如 web2py_manual 中所述)。

    【讨论】:

    • 感谢您确定一切都有意义
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 2020-10-08
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多