Implementación de la página de pedidos del usuario en Django

Visualización de la sección de pedidos del usuario

Edite el archivo user/views.py y añada la clase UserOrderView

class UserOrderView(LoginRequiredMixin, View):
    '''Clase para manejar pedidos del usuario'''
    template_name = 'user/user_center_order.html'
    contexto = {'tipo': ''}

    def get(self, request, num_pagina):
        '''Muestra los pedidos del usuario'''
        self.contexto['tipo'] = 'pedido'
        usuario = request.user
        # Obtener información de pedidos
        pedidos = PedidoInfo.objects.filter(usuario=usuario).order_by('-fecha_creacion')
        # Recorrer cabeceras de pedidos
        for pedido in pedidos:
            articulos_pedido = ArticuloPedido.objects.filter(pedido=pedido)
            # Atributos dinámicos para el pedido
            pedido.articulos_pedido = articulos_pedido
            pedido.estado_nombre = PedidoInfo.ESTADO_PEDIDO_DIC[pedido.estado_pedido]
            pedido.metodo_pago = PedidoInfo.METODO_PAGO_DIC[str(pedido.metodo_pago)]
            # Recorrer artículos del pedido
            for articulo in articulos_pedido:
                # Atributos dinámicos para artículos
                articulo.total = articulo.precio * articulo.cantidad

        # Paginación
        # Crear objeto Paginator
        paginador = Paginator(pedidos, 3)
        total_paginas = paginador.num_pages
        # Validar número de página
        if num_pagina > total_paginas:
            num_pagina = 1
        # Obtener objeto Page
        pagina = paginador.page(num_pagina)
        # Números de página, mostrar máximo 3 páginas
        if total_paginas < 3:
            paginas = range(1, total_paginas + 1)
        elif num_pagina < 2:
            paginas = range(1, 4)
        elif num_pagina > total_paginas - 1:
            paginas = range(total_paginas-2, total_paginas+1)
        else:
            paginas = range(num_pagina-1, num_pagina + 2)
        # Preparar contexto
        self.contexto['pagina'] = pagina
        self.contexto['paginas'] = paginas
        return render(request, self.template_name, self.contexto)

1. Obtener las cabeceras de pedidos del usuario conectado, recorrerlas y obtener los artículos correspondientes, al pasar la estructura cabecera-artículo a la plantilla, primero se puede recorrer la cabecera, luego consultar los artículos debajo de ella y agregar el conujnto de resultados como un atributo a la cabecera. De esta manera, solo es necesario pasar la cabecera al archivo de plantilla.

# Recorrer cabeceras
for cabecera in cabeceras:
    # Consultar conjunto de resultados de líneas
    lineas = Linea.objects.filter(cabecera=cabecera)
    # Agregar conjunto de líneas como atributo a la cabecera
    cabecera.lineas = lineas

# Pasar datos a la plantilla
return render(request, nombre_plantilla, {'cabeceras': cabeceras})

...

# En el archivo de plantilla, recorrer cabeceras y líneas
{% for cabecera in cabeceras %}
....
  {% for linea in cabecera.lineas %}
  ...
  {% end for %}
{% end for %}

2. Paginación, agregar parámetro <int:num_pag> en la URL para mostrar páginas específicas:

  • Importar módulo de paginación: from django.core.paginator import Paginator
  • Crear objeto de paginación según cabeceras de pedido, mostrar tres pedidos por página: paginador = Paginator(pedidos, 3)
  • Validar parámetro de número de página en URL, si es incorrecto restablecer a primera página
  • Obtener objeto de página: pagina = paginador.page(num_pag)
  • Configurar visualización de lista de números de página en la parte inferior, mostrar solo 5 números
# Números de página, mostrar máximo 5 páginas
# Número de página mínimo a mostrar
min_pag = num_pag - 2
# Número de página máximo a mostrar
max_pag = num_pag + 2
# Si número mínimo es menor que 1, establecer en 1
# Agregar la diferencia al número máximo para mantener 5 páginas
diferencia = min_pag - 1
if diferencia < 0:
    min_pag = 1
    max_pag -= diferencia
# Si número máximo excede total de páginas, establecer en total
# Restar la diferencia del número mínimo para mantener 5 páginas
diferencia = max_pag - total_paginas
if diferencia > 0:
    max_pag = total_paginas
    min_pag -= diferencia
# Configurar rango de números de página a mostrar
paginas = range(min_pag, max_pag + 1)

Preparar contexto, pasar objeto de página y lista de números a la plantilla:

# Preparar contexto
self.contexto['pagina'] = pagina
self.contexto['paginas'] = paginas
return render(request, self.template_name, self.contexto)

Editar archivo de URL y plentilla

{% extends 'base_usuario_central.html' %}
{% load static %}
{% block right %}
<div class="contenido_derecha clearfix">
    <h3 class="titulo_comun2">Todos los pedidos</h3>
    {% for pedido in pagina %}
    - {{ pedido.fecha\_creacion }}
- {{ pedido.numero\_pedido }}
- {{ pedido.estado\_nombre }}

    | {% for articulo in pedido.articulos\_pedido %} - [![]({{ articulo.producto.imagen.url }})](<{% url 'productos:detalle' articulo.producto.id %}>) - [{{ articulo.producto.nombre }}*{{ articulo.producto.precio }}元/{{ articulo.producto.unidad }}*](<{% url 'productos:detalle' articulo.producto.id %}>) - {{ articulo.cantidad }} - {{ articulo.total }}    {% endfor %} | {{ pedido.monto\_total\|add:pedido.monto\_envio }}元(incluye envío) | {{ pedido.estado\_nombre }}Método de pago: {{ pedido.metodo\_pago }} | [Pagar](#) |
|---|---|---|---|
    {% empty %}
    No hay pedidos
    {% endfor %}

    <div class="paginacion">
        {% if pagina.has_previous %}
        <a href="{% url 'usuario:pedido' pagina.previous_page_number %}"><Anterior</a>
        {% endif %}
        {% for num in paginas %}
        <a href="{% url 'usuario:pedido' num %}" {% if num == pagina.number %}class="activo"{% endif %}>{{ num }}</a>
        {% endfor %}
        {% if pagina.has_next %}
        <a href="{% url 'usuario:pedido' pagina.next_page_number %}>Siguiente></a>
        {% endif %}
    </div>
</div>
{% endblock right %}

Etiquetas: Django ecommerce pedidos usuario Paginación

Publicado el 6-9 23:55