J'ai une question assez simple. Je veux faire des vues génériques sur un site Django, mais je veux aussi les paginer. Selon la documentation, la vue object_list a des arguments page et paginate_by, mais pas la vue archive_month. Quelle est la "bonne" façon de le faire?Pagination des vues génériques basées sur la date dans Django
Répondre
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.
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 }}
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.
+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
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.
Il existe également un excellent module complémentaire django-pagination, totalement indépendant de la vue sous-jacente.
- 1. Vues basées sur le rôle Django?
- 2. Django nommé urls, vues génériques?
- 3. Puis-je filtrer sur request.user lorsque j'utilise des vues génériques Django?
- 4. Utilisation d'ASP.NET MVC avec des vues génériques
- 5. Vues en MySQL basées sur plusieurs valeurs calculées
- 6. Comment suivre l'importation des vues dans Django
- 7. Spécification de différents noms de modèles dans les vues génériques Django
- 8. format de filtre django pour la date
- 9. Pagination dépendante de la date PHP
- 10. Puis-je utiliser les vues génériques de Django avec google-app-engine-django?
- 11. asp.net mvc vues génériques/personnalisés
- 12. requêtes Django, content_types génériques
- 13. clés Récupération de nouvel objet créé à partir create_object utilisant des vues génériques de Django
- 14. Construire des conditions de recherche basées sur des contextes d'exécution
- 15. Passer des variables à Django Commenter Vues
- 16. Dans MySQL 5.x, est-il possible de donner des permissions basées sur des conditions (n'utilisant pas de vues)?
- 17. Simulations basées sur l'agent utilisant la XBOX 360 en C#
- 18. Bibliothèques partagées basées sur la configuration (DLL)
- 19. joignant deux tables basées sur des données de cookie
- 20. (re) Utilisation des dictionnaires dans les vues django
- 21. Applications Web Gallery basées sur Python?
- 22. script pagination jquery pour la pagination table
- 23. Solutions Webmail basées sur Java
- 24. Comment obtenir des messages à date future dans Django?
- 25. Django sélectionnez la date multiple du calendrier
- 26. Comment faire de la pagination dans XSLT
- 27. Django Pagination - allez être redirigé vers la page d'un objet est sur
- 28. Comment avoir des synchronisations incrémentielles partielles basées sur un GUID?
- 29. Filtrer une date complète dans django?
- 30. Exposer des sous-classes WCF basées sur une classe abstraite
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
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