Web2py ...连接到正确的控制器

3 投票
1 回答
1689 浏览
提问于 2025-04-17 13:10

我有两个表:一个是商家表,另一个是文章表。

我还创建了三个控制器:主页控制器、文章控制器和商家控制器。

在主页控制器中,有一段代码可以返回商家和文章的列表:

     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 个回答

5

与其使用重定向,为什么不直接链接到每个控制器里的 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)))。

撰写回答