En este momento tengo una vista de lista que muestra 10 publicaciones por página:

Las URL serían algo como esto:

www.example.com/posts/1  (First page with 10 results)
www.example.com/posts/2  (Next page with 10 results)

Y mi urls.py se parece a esto:

path('posts/<int:page>', PostList.as_view(), name='post-list'),

Quiero poder tener la primera página de publicaciones también visible cuando no hay un número, por ejemplo:

www.example.com/posts  (First page with 10 results)

La única forma en que he podido resolver esto es agregando otra línea en urls.py que apunta a la misma vista y que tiene el mismo nombre.

path('posts', PostList.as_view(), name='post-list'),
path('posts/<int:page>', PostList.as_view(), name='post-list'),

¿Es esta la forma adecuada de hacer esto o hay una mejor manera?

¡Muchas gracias!

2
Alvaro Bataller 29 oct. 2019 a las 09:14

4 respuestas

La mejor respuesta
//this or is there a better way pagination page:

// ejemplo:

Índice de definición (solicitud): user_list = User.objects.all () página = request.GET.get ('página', 1)

paginator = Paginator(user_list, 10)
try:
    users = paginator.page(page)
except PageNotAnInteger:
    users = paginator.page(1)
except EmptyPage:
    users = paginator.page(paginator.num_pages)

return render(request, 'core/user_list.html', { 'users': users })
0
Mas Hary 29 oct. 2019 a las 07:28

Lo siento, lo he intentado de alguna manera pero fallé. En realidad, siempre me gusta esto:

# urls.py

urlpatterns = [
    path('posts/', PostList.as_view()),
]

Y:

# views.py
class PostList(View):

    def get(self, request):
        return HttpResponse('true')

    def post(self, request):
        page = request.POST.get('page')
        print(page)
        return HttpResponse('false')

Para la paginación, puede considerar usar el método POST , eso es todo

0
Ginta 29 oct. 2019 a las 08:36

Puede establecer un valor predeterminado para la página. En otros mundos, si la clase Lista de publicaciones no obtiene el parámetro página , y el valor de página por defecto 1.Hope te puede ayudar!

1
Ginta 29 oct. 2019 a las 06:24
 list view that displays 10 posts per page :
this solutions :

view.py
----------
from django.contrib.auth.models import User
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def index(request):
    user_list = User.objects.all()
    page = request.GET.get('page', 1)

    paginator = Paginator(user_list, 10)
    try:
        users = paginator.page(page)
    except PageNotAnInteger:
        users = paginator.page(1)
    except EmptyPage:
        users = paginator.page(paginator.num_pages)

    return render(request, 'core/user_list.html', { 'users': users })


user_list.html
--------------
<table class="table table-bordered">
  <thead>
    <tr>
      <th>Username</th>
      <th>First name</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
    {% for user in users %}
      <tr>
        <td>{{ user.username }}</td>
        <td>{{ user.first_name }}</td>
        <td>{{ user.email }}</td>
      </tr>
    {% endfor %}
  </tbody>
</table>

{% if users.has_other_pages %}
  <ul class="pagination">
    {% if users.has_previous %}
      <li><a href="?page={{ users.previous_page_number }}">«</a></li>
    {% else %}
      <li class="disabled"><span>«</span></li>
    {% endif %}
    {% for i in users.paginator.page_range %}
      {% if users.number == i %}
        <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
      {% else %}
        <li><a href="?page={{ i }}">{{ i }}</a></li>
      {% endif %}
    {% endfor %}
    {% if users.has_next %}
      <li><a href="?page={{ users.next_page_number }}">»</a></li>
    {% else %}
      <li class="disabled"><span>»</span></li>
    {% endif %}
  </ul>
{% endif %}
0
Mas Hary 29 oct. 2019 a las 07:32