web2py映射控制器查看
Web2py mapping controller to view
只是想知道是否有人可以在这里为我指出正确的 web2py 应用程序方向。到目前为止,我有 2 个控制器,但我会使用更多。我有的 2 个是 index.py
和 diary_manager.py
.
index.py
return 目前是一个空字典,只公开 myapp/views/index/
目录中的 index.html
视图。在 index.html
中,用户可以单击具有 href
属性的界面中的按钮,如下所示:
<a href="{{=URL(c="diary_manager", f="diary_manager")}}">Diary</a>
如果我单击 link,它将调用 diary_manager.py
控制器中的 diary_manager
函数。到目前为止一切都很好。
现在我遇到了一个问题。如果我 return 来自 diary_manager
函数的 dict
我必须将相应的视图放在 myapp/views/diary_manager/
目录中,这将被公开。另一方面,如果我不 return 字典,我根本无法公开视图。
所以我有几个问题:
当我 return 字典时,为什么我必须在视图中创建一个与控制器名称相匹配的目录名称?
有什么办法可以阻止这种情况,这样我就可以将所有视图直接放入视图目录中吗?
如何强制没有 return 指令的控制器打开特定视图?
我希望所有这些都清楚!
我想 MVC 概念的整个想法是让你的生活更轻松,只要你遵守一些规则。
您可以设置一个值response.view。另外,还有一个"redirect".
你不能。仅当操作 returns 字典(如 web2py_manual 中所述)时才会调用视图。
- Why do I have to create a directory name matching the controller name in the view when I return a dict?
你不必。这只是一个约定,因此您不必为每个操作明确指定关联视图的位置。如果您不喜欢这种约定,您可以将视图放在任何您想要的位置并根据需要命名它们,但是您必须为每个操作明确指定视图。
- Is there a way to stop this so I can just put all of my views directly into the views directory?
是的,您可以设置自己的约定,然后包含代码以根据某些规则设置 response.view
的值。例如,假设您将所有视图文件放在顶级 /views
目录中,并使用 [controller]_[function].[extension]
模式命名它们。在这种情况下,在模型文件中,您可以包含以下行:
response.view = '%s_%s.%s' % (request.controller, request.function,
request.extension)
如果上述代码在模型文件中,它将在每次请求时执行,因此它会为每个 controller/action.
正确设置视图文件
- How can I force a controller that does not return a dict to open a specific view?
为什么你需要这样做?如果你没有任何东西 return 但只是想执行一个视图,那么你可以 return 一个空字典。
或者,您的函数可以直接渲染视图和 return 渲染输出:
def myfunction():
[some code]
return response.render()
response.render()
可选择采用第一个参数,即视图文件名,以及第二个参数,即视图环境中可用的变量字典。
只是想知道是否有人可以在这里为我指出正确的 web2py 应用程序方向。到目前为止,我有 2 个控制器,但我会使用更多。我有的 2 个是 index.py
和 diary_manager.py
.
index.py
return 目前是一个空字典,只公开 myapp/views/index/
目录中的 index.html
视图。在 index.html
中,用户可以单击具有 href
属性的界面中的按钮,如下所示:
<a href="{{=URL(c="diary_manager", f="diary_manager")}}">Diary</a>
如果我单击 link,它将调用 diary_manager.py
控制器中的 diary_manager
函数。到目前为止一切都很好。
现在我遇到了一个问题。如果我 return 来自 diary_manager
函数的 dict
我必须将相应的视图放在 myapp/views/diary_manager/
目录中,这将被公开。另一方面,如果我不 return 字典,我根本无法公开视图。
所以我有几个问题:
当我 return 字典时,为什么我必须在视图中创建一个与控制器名称相匹配的目录名称?
有什么办法可以阻止这种情况,这样我就可以将所有视图直接放入视图目录中吗?
如何强制没有 return 指令的控制器打开特定视图?
我希望所有这些都清楚!
我想 MVC 概念的整个想法是让你的生活更轻松,只要你遵守一些规则。
您可以设置一个值response.view。另外,还有一个"redirect".
你不能。仅当操作 returns 字典(如 web2py_manual 中所述)时才会调用视图。
- Why do I have to create a directory name matching the controller name in the view when I return a dict?
你不必。这只是一个约定,因此您不必为每个操作明确指定关联视图的位置。如果您不喜欢这种约定,您可以将视图放在任何您想要的位置并根据需要命名它们,但是您必须为每个操作明确指定视图。
- Is there a way to stop this so I can just put all of my views directly into the views directory?
是的,您可以设置自己的约定,然后包含代码以根据某些规则设置 response.view
的值。例如,假设您将所有视图文件放在顶级 /views
目录中,并使用 [controller]_[function].[extension]
模式命名它们。在这种情况下,在模型文件中,您可以包含以下行:
response.view = '%s_%s.%s' % (request.controller, request.function,
request.extension)
如果上述代码在模型文件中,它将在每次请求时执行,因此它会为每个 controller/action.
正确设置视图文件
- How can I force a controller that does not return a dict to open a specific view?
为什么你需要这样做?如果你没有任何东西 return 但只是想执行一个视图,那么你可以 return 一个空字典。
或者,您的函数可以直接渲染视图和 return 渲染输出:
def myfunction():
[some code]
return response.render()
response.render()
可选择采用第一个参数,即视图文件名,以及第二个参数,即视图环境中可用的变量字典。