2009-03-21 10 views

Répondre

1

Les vues génériques de date n'ont pas de pagination. Il semble que vous ne pouvez pas ajouter de pagination en les enveloppant aussi puisqu'ils retournent le résultat rendu.

J'écrirais simplement ma propre vue dans ce cas. Vous pouvez également consulter le code des vues génériques, mais la plupart de ces informations ne seront probablement pas nécessaires dans votre cas.

Depuis votre question est une question valide, et en regardant le code; Je me demande pourquoi ils n'ont pas découplé la génération de queryset en tant que fonctions séparées. Vous pouvez simplement les utiliser et les rendre comme vous le souhaitez.

+0

Ouais, c'est exactement ce que je recherche, les fonctions pour générer le jeu de query bâti sur les paramètres de date. Si je l'ai, alors je peux simplement utiliser la liste d'objets ou l'objet de pagination. Comme c'est le cas maintenant, je pense que je vais devoir écrire mes propres opinions. – Apreche

+0

J'ai moi-même été frustré par les vues génériques de django, et j'ai fondamentalement écrit une méthode divine de type générique-vue-usine afin de ne pas avoir les limitations mentionnées ici. – SingleNegationElimination

3

J'ai créé une balise de gabarit pour faire une pagination basée sur un gabarit sur les collections passées aux gabarits qui ne sont pas déjà paginés. Copiez le code suivant dans un fichier app/templatetags/pagify.py.

from django.template import Library, Node, Variable 
from django.core.paginator import Paginator 
import settings 

register = Library() 

class PagifyNode(Node): 
    def __init__(self, items, page_size, varname): 
     self.items = Variable(items) 
     self.page_size = int(page_size) 
     self.varname = varname 

    def render(self, context): 
     pages = Paginator(self.items.resolve(context), self.page_size) 
     request = context['request'] 
     page_num = int(request.GET.get('page', 1)) 

     context[self.varname] = pages.page(page_num) 
     return '' 

@register.tag 
def pagify(parser, token): 
    """ 
    Usage: 

    {% pagify items by page_size as varname %} 
    """ 

    bits = token.contents.split() 
    if len(bits) != 6: 
     raise TemplateSyntaxError, 'pagify tag takes exactly 5 arguments' 
    if bits[2] != 'by': 
     raise TemplateSyntaxError, 'second argument to pagify tag must be "by"' 
    if bits[4] != 'as': 
     raise TemplateSyntaxError, 'fourth argument to pagify tag must be "as"' 
    return PagifyNode(bits[1], bits[3], bits[5]) 

Pour l'utiliser dans les modèles (supposons que nous avons passé dans une liste non paginé appelé articles):

{% load pagify %} 

{% pagify items by 20 as page %} 
{% for item in page %} 
    {{ item }} 
{% endfor %} 

L'argument page_size (20) peut être une variable bien. Le tag détecte automatiquement les variables page=5 dans la chaîne de requête. Et si vous avez besoin d'obtenir au paginator qui appartiennent à la page (pour un nombre de pages, par exemple), vous pouvez simplement appeler:

{{ page.paginator.num_pages }} 
1

je travaillais sur un problème similaire à hier, et je trouvé la meilleure solution pour moi était personnellement d'utiliser la vue générique object_list pour toutes les pages basées sur la date, mais passer un queryset filtré, comme suit:

import datetime, time 

def post_archive_month(request, year, month, page=0, template_name='post_archive_month.html', **kwargs): 
    # Convert date to numeric format 
    date = datetime.date(*time.strptime('%s-%s' % (year, month), '%Y-%b')[:3]) 
    return list_detail.object_list(
     request, 
     queryset = Post.objects.filter(publish__year=date.year, publish__date.month).order_by('-publish',), 
     paginate_by = 5, 
     page = page, 
     template_name = template_name, 
     **kwargs) 

Lorsque le urls.py lit quelque chose comme:

url(r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/$', 
    view=path.to.generic_view, 
    name='archive_month'), 

J'ai trouvé cela le moyen le plus simple de contourner le problème sans avoir à pirater les autres vues génériques ou à écrire une vue personnalisée.

+0

+1 bien qu'il vous faudrait ajouter des informations supplémentaires au extra_context pour compenser les variables supplémentaires (année, mois, etc.) que les vues basées sur la date transmettent. – Soviut

0

Les vues génériques basées sur la date de Django ne prennent pas en charge la pagination. Il y a un open ticket from 2006 à ce sujet. Si vous le souhaitez, vous pouvez essayer les correctifs de code fournis pour implémenter cette fonctionnalité. Je ne sais pas pourquoi les correctifs n'ont pas encore été appliqués à la base de code.

1

Il existe également un excellent module complémentaire django-pagination, totalement indépendant de la vue sous-jacente.

Questions connexes