只是想知道是否有人可以在这里指出我正确的方向为web2py应用程序。到目前为止我有2个控制器,但我将使用更多。我有的是index.py
和diary_manager.py
。
index.py
此时返回一个空的dict,只显示index.html
目录中的myapp/views/index/
视图。在index.html
范围内,用户可以使用href
属性点击界面中的按钮,如下所示:
<a href="{{=URL(c="diary_manager", f="diary_manager")}}">Diary</a>
如果我点击该链接,它将调用diary_manager
控制器中的diary_manager.py
功能。到目前为止一切都很棒。
现在这是我遇到问题的地方。如果我从dict
函数返回diary_manager
,我必须将相应的视图放在myapp/views/diary_manager/
目录中,这将暴露出来。另一方面,如果我不回复词典,我根本就不能公开一个视图。
所以我有几个问题:
为什么我在返回词典时必须在视图中创建与控制器名称匹配的目录名称?
有没有办法阻止这个,所以我可以把我的所有观点直接放到views目录中?
如何强制不返回dict的控制器打开特定视图?
我希望所有这一切都清楚!
答案 0 :(得分:1)
我想MVC概念的整个想法是让你的生活更轻松,只要你遵守一些规则。
您可以设置response.view的值。此外,还有一个“重定向”。
你不能。仅当操作返回字典时才会调用该视图(如web2py_manual中所述)。
答案 1 :(得分:1)
- 为什么在返回字典时我必须在视图中创建与控制器名称匹配的目录名称?
醇>
你不必。这只是一个约定,因此您不必明确指定每个操作的关联视图的位置。如果您不喜欢该约定,您可以将视图放在任何位置,并根据需要为其命名,但是您必须明确指定每个操作的视图。
- 有没有办法阻止这个,所以我可以把我的所有观点直接放到views目录中?
醇>
是的,您可以设置自己的约定,然后根据某些规则包含代码以设置response.view
的值。例如,假设您将所有视图文件放在顶级/views
目录中,并使用模式[controller]_[function].[extension]
命名它们。在这种情况下,在模型文件中,您可以包含以下行:
response.view = '%s_%s.%s' % (request.controller, request.function,
request.extension)
如果上面的代码在模型文件中,它将在每个请求上执行,因此它将为每个控制器/操作正确设置视图文件。
- 如何强制不返回dict的控制器打开特定视图?
醇>
为什么你需要这样做?如果您没有任何要返回但只想执行视图的内容,那么您可以返回一个空字典。
或者,您的函数可以直接渲染视图并返回渲染的输出:
def myfunction():
[some code]
return response.render()
response.render()
可选地接受第一个参数,即视图文件名,以及第二个参数,它是视图环境中可用的变量字典。