Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

216
Views
Paginación de Django desde ?page= a /page/

tengo esta vista:

 class PageView(ListView): # ... code ... paginate_by = 4

En la plantilla tengo algo como:

 <div class="pagination"> <span class="page-links"> {% if page_obj.has_previous %} <a href="{{ request.path }}?page={{ page_obj.previous_page_number }}">previous</a> {% endif %} <span class="page-current"> Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}. </span> {% if page_obj.has_next %} <a href="{{ request.path }}?page={{ page_obj.next_page_number }}">next</a> {% endif %} </span> </div>

¿Cómo puedo transformar la variable GET ?page=number para que se vea como /page/number/ en django?

about 4 years ago · Santiago Trujillo
3 answers
Answer question

0

No puedo probarlo ahora, pero debería poder reutilizar todo ListView .

Eche un vistazo a django.views.generic.list.MultipleObjectMixin#paginate_queryset :

 def paginate_queryset(self, queryset, page_size): """ Paginate the queryset, if needed. """ paginator = self.get_paginator( queryset, page_size, orphans=self.get_paginate_orphans(), allow_empty_first_page=self.get_allow_empty()) page_kwarg = self.page_kwarg # HERE page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1 try: page_number = int(page) except ValueError: if page == 'last': page_number = paginator.num_pages else: raise Http404(_("Page is not 'last', nor can it be converted to an int.")) try: page = paginator.page(page_number) return (paginator, page, page.object_list, page.has_other_pages()) except InvalidPage as e: raise Http404(_('Invalid page (%(page_number)s): %(message)s') % { 'page_number': page_number, 'message': str(e) })

Esto significa que Django busca el número de página primero en los kwargs de la vista y luego en los parámetros get .

Los valores en self.kwargs provienen de los propios **kwargs de la vista; consulte django.views.generic.base.View#as_view . Esto significa que debería poder definir una URL como url(r'^event/(?P<page>'d+)/$' y usarla con su CBV existente; debería recoger el número de página por sí solo.

about 4 years ago · Santiago Trujillo Report

0

por ejemplo, puede usar la función de vista:

 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def listOfSomethinView(request, page): paginator(Something.objects.all(), 10) try: list_of_something = paginator.page(page) except PageNotAnInteger: list_of_something = paginator.page(1) except EmptyPage: list_of_something = paginator.page(paginator.num_pages) return render(request, 'path_to_your_template', { 'list_of_something': list_of_something, })

en urls.py agrega esto:

 url(r'^event/(?P<page>[0-9]{1,10})/$', views.listOfSomethingView, name='listOfSomething')

en tu plantilla usa algo como esto

 {% url 'app:listOfSomething' paginator.previous_page_number %}
about 4 years ago · Santiago Trujillo Report

0

ESTÁ BIEN. Lo resolví. En realidad cuando tenía:

 url(r'^events/(?P<page>[0-9]+)/$', views.PageView.as_view(), name='events'),

Genera un error porque falta el argumento de la page y urls.py no conoce la ruta /events/ .

Entonces, en mi mapeo de URL (urls.py) he escrito:

 url(r'^events/$', views.PageView.as_view(), name='events'), url(r'^events/(?P<page>[a-z0-9]+)/$', views.PageView.as_view(), name='events'),

Cuando voy a /events/ , no se necesitan argumentos, la page se establece en 1 porque no se proporciona page_kwarg , todo bien.

Cuando voy a /events/<page>/ , toma esa variable y finalmente funciona.

Editar: puse [a-z0-9] en lugar de [0-9] porque es necesario cuando accede a /events/last/ . En la etiqueta de plantilla de URL, debo proporcionar last como una cadena: {% url 'events' 'last' %}

Gracias por las respuestas. Si cree que mi solución no es buena, comente debajo de mi respuesta.

Lo siento por mi gramática.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!