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 %} - [](<{% 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 %}