TurboGears – 分页

TurboGears 提供了一个方便的装饰器 paginate() 来划分页面中的输出。此装饰器与 reveal() 装饰器结合使用。@Paginate() 装饰器将查询结果的字典对象作为参数。此外,每页的记录数由 items_per_page 属性的值决定。确保将 tg.decorators 中的 paginate 函数导入到代码中。

在 root.py 中重写 listrec() 函数,如下所示 −

from tg.decorators import paginate
class RootController(BaseController):
   @expose ("hello.templates.studentlist")
   @paginate("entries", items_per_page = 3)
	
   def listrec(self):
      entries = DBSession.query(student).all()
      return dict(entries = entries)

每页的项目数设置为 3。

在 studentlist.html 模板中,通过在 py:for 指令下添加 tmpl_context.paginators.entries.pager() 来启用页面导航。此模板的代码应如下所示 −

<html xmlns = "http://www.w3.org/1999/xhtml"
   xmlns:py = "http://genshi.edgewall.org/">
   
   <head>
      <link rel = "stylesheet" type = "text/css" media = "screen" 
         href = "${tg.url('/css/style.css')}" />
      <title>Welcome to TurboGears</title>
   </head>
   
   <body>
      
      <h1>Welcome to TurboGears</h1>
		
      <py:with vars = "flash = tg.flash_obj.render('flash', use_js = False)">
         <div py:if = "flash" py:replace = "Markup(flash)" />
      </py:with>
      
      <h2>Current Entries</h2>
		
      <table border = '1'>
         <thead>
            <tr>
               <th>Name</th>
               <th>City</th>
               <th>Address</th>
               <th>Pincode</th>
            </tr>
         </thead>
         
         <tbody>
            <py:for each = "entry in entries">
               <tr>
                  <td>${entry.name}</td>
                  <td>${entry.city}</td>
                  <td>${entry.address}</td>
                  <td>${entry.pincode}</td>
               </tr>
            </py:for>
				
            <div>${tmpl_context.paginators.entries.pager()}</div>
         </tbody>
         
      </table>
   
   </body>

</html>

在浏览器中输入 http://localhost:8080/listrec。将显示表中的第一页记录。在此表的顶部,还可以看到页码的链接。

Record

如何向数据网格添加分页支持

也可以向数据网格添加分页支持。在下面的示例中,分页数据网格旨在显示操作按钮。为了激活操作按钮,使用以下代码构造数据网格对象 −

student_grid = DataGrid(fields = [('Name', 'name'),('City', 'city'),
   ('Address','address'), ('PINCODE', 'pincode'),
   ('Action', lambda obj:genshi.Markup('<a
      href = "%s">Edit</a>' % url('/edit',
      params = dict(name = obj.name)))) ])

此处的操作按钮与数据网格中每行的名称参数相关联。

重写 showgrid() 函数,如下所示 −

@expose('hello.templates.grid')
@paginate("data", items_per_page = 3)

def showgrid(self):
   data = DBSession.query(student).all()
   return dict(page = 'grid', grid = student_grid, data = data)

浏览器显示分页数据网格如下 −

Registration Form

单击第三行的"编辑"按钮,它将重定向到以下 URL http://localhost:8080/edit?name=Rajesh+Patil

TurboGears – 管理员访问

TurboGears 提供 tgext.admin 扩展,由 tgext.crud 和 sprox 提供支持。此 Sprox 是一个用于直接从数据库模式创建 Web 小部件的包。这可用于自动创建简单的管理页面,并且是支持新快速启动应用程序中的 /admin 页面的工具包。

默认情况下,管理员将自动生成对项目 models/__init__.py 中导入的所有模型的访问权限。

如何创建 TurboGears 管理员

默认的 TurboGears 管理员是作为 AdminController 类的对象创建的 −

from tgext.admin.controller import AdminController

class RootController(BaseController):
   admin = AdminController(model, DBSession, config_type = TGAdminConfig)

这将为所有具有默认 TurboGears 管理配置的模型创建一个管理员。

通过管理器,在设置阶段创建了一个用户。现在,可以通过 http://localhost:8080/admin 访问 TurboGears 管理员。首次访问此页面时,它将要求进行身份验证。您只需提供 setup-app 命令为我们创建的用户名和密码即可 −

Username: manager
Password: managepass

为了登录快速启动项目,请将以下函数添加到 RootController 类 (controllers/root.py)。

from hello.lib.base import BaseController
from tg import expose, flash, redirect, request,url, lurl
from tg import redirect, validate
from hello import model
from hello.model import DBSession
from tgext.admin.tgadminconfig import BootstrapTGAdminConfig as TGAdminConfig
from tgext.admin.controller import AdminController
from tg.exceptions import HTTPFound

class RootController(BaseController):
   admin = AdminController(model, DBSession, config_type =  TGAdminConfig)
   
   @expose('hello.templates.index')
   def index(self):
      return dict(page = 'index')
   
   @expose('hello.templates.login')
   def login(self, came_from = lurl('/'), failure = None,    login = ''):
	
      if failure is not None:
         if failure == 'user-not-found':
            flash(_('User not found'), 'error')
         elif failure == 'invalid-password':
            flash(_('Invalid Password'), 'error')
			
      login_counter = request.environ.get('repoze.who.logins', 0)
		
      if failure is None and login_counter > 0:
         flash(_('Wrong credentials'), 'warning')
		 
      return dict(page = 'login', login_counter = str(login_counter), 
         came_from = came_from, login = login)
   @expose()
	
   def post_login(self, came_from = lurl('/')):
      if not request.identity:
         
         login_counter = request.environ.get('repoze.who.logins', 0) + 1
            redirect('/login', params = dict(came_from = came_from,
            __logins = login_counter))
		
         userid = request.identity['repoze.who.userid']
         flash(('Welcome back, %s!') % userid)
			
         return HTTPFound(location = came_from)

启动服务器后,通过访问 http://localhost:8080/login 登录"quickstarted"应用程序,然后输入如上所示的管理员凭据。浏览器将显示如下所示的管理页面 −

Admin pade

该页面显示此应用程序中创建的所有模型。您可以单击任何模型以查看其中的条目列表 −

Student Listing

此数据网格顶部的"新建"按钮允许添加记录。同样,此数据网格的操作列中还提供了用于编辑和删除记录的操作按钮。还显示一个搜索框,用于有条件地选择记录。

DataGrid