TurboGears - Pagination

TurboGears fournit un décorateur pratique appelé paginate () pour diviser la sortie dans les pages. Ce décorateur est combiné avec le décorateur expose (). Le décorateur @Paginate () prend l'objet dictionnaire du résultat de la requête comme argument. De plus, le nombre d'enregistrements par page est déterminé par la valeur de l'attribut items_per_page. Assurez-vous que vous importez la fonction de pagination de tg.decorators dans votre code.

Réécrivez la fonction listrec () dans root.py comme suit -

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)

Les éléments par page sont définis sur trois.

Dans le modèle studentlist.html, la navigation dans les pages est activée en ajoutant tmpl_context.paginators.entries.pager () sous la directive py: for. Le code de ce modèle doit être comme ci-dessous -

<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>

Entrer http://localhost:8080/listrecdans le navigateur. La première page d'enregistrements du tableau s'affiche. En haut de ce tableau, des liens vers les numéros de page sont également affichés.

Comment ajouter la prise en charge de la pagination à Datagrid

Il est également possible d'ajouter la prise en charge de la pagination à datagrid. Dans l'exemple suivant, la grille de données paginée est conçue pour afficher le bouton d'action. Afin d'activer le bouton d'action, l'objet datagrid est construit avec le code suivant -

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)))) ])

Ici, le bouton d'action est lié au paramètre de nom de chaque ligne de la grille de données.

Réecrit le showgrid() fonction comme suit -

@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)

Le navigateur affiche la grille de données paginée comme suit -

En cliquant sur le bouton Modifier dans la troisième ligne, il sera redirigé vers l'URL suivante http://localhost:8080/edit?name=Rajesh+Patil