Web2py ...连接到正确的控制器
我有两个表:一个是商家表,另一个是文章表。
我还创建了三个控制器:主页控制器、文章控制器和商家控制器。
在主页控制器中,有一段代码可以返回商家和文章的列表:
def index():
lists= db().select(db.article.ALL,limitby=(0, 5),orderby=~db.article.id)
listings=db().select(db.business.ALL)
return dict(lists=lists,listings=listings)
然后在主页的视图文件中用一个循环来显示这些内容。
我想把文章链接到文章控制器,把商家链接到商家控制器,所以我在主页上使用了以下代码:
def show():
myid == request.vars.id
redirect(URL(c='businesses',f='show?id=%s'% myid))
这样,文章列表现在也会链接到商家控制器,使用商家控制器中的show函数,但我想根据不同的列表使用if和elif来处理。
1 个回答
与其使用重定向,为什么不直接链接到每个控制器里的 show()
函数,并将网址设置成这样呢:
{{for article in lists:}}
<a href="{{=URL('article', 'show', args=article.id)}}">{{=article.title}}</a>
{{pass}}
对于商业链接也是类似的。
在 article.py 文件中:
def show():
article = db(db.article.id == request.args(0)).select().first()
return dict(article=article)
另一种选择是只在主控制器中使用一个 show()
函数来处理文章和商业信息。在这种情况下,链接会像这样:
文章: URL('home', 'show', args=['article', article.id])
商业: URL('home', 'show', args=['business', business.id])
在 home.py 文件中:
def show():
item = db(db[request.args(0)].id == request.args(1)).select().first()
return dict(item=item)
然后,show.html 视图可以根据 request.args(0)
的值来显示文章和商业信息的方式不同,或者 show()
函数可以明确设置不同的 article.html 和 business.html 视图,如下所示:
response.view = 'home/%s.html' % request.args(0)
小提示:如果你把记录的 ID 作为参数而不是变量,网址会看起来更好(比如说 /show/1 而不是 /show?id=1)。另外,如果你确实需要在 URL()
函数中指定变量,不要把它们直接附加到函数名后面作为查询字符串(也就是说,不要这样做 URL(..., f='show?id=%s' % myid)
)——而是使用 vars
参数(比如 URL(..., f='show', vars=dict(id=myid))
)。