Vistas, Templates y Rutas en Django

En este capítulo aprenderás a implementar las vistas, templates y rutas principales de una aplicación de farmacia en Django. Estos pasos son esenciales para que la aplicación sea funcional y permita operaciones CRUD básicas sobre los medicamentos.

Modelos y Formularios

Para este tutorial, se reutilizan los siguientes modelos y formularios:

Tip
  • Modelos (models.py)
from django.db import models

class Medicamento(models.Model):
    nombre = models.CharField(max_length=100)
    precio = models.DecimalField(max_digits=10, decimal_places=2)
    existencias = models.IntegerField()
    lugar = models.CharField(max_length=100)
    fecha = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.nombre

class Venta(models.Model):
    medicamento = models.ForeignKey(Medicamento, on_delete=models.CASCADE)
    cantidad = models.IntegerField()
    fecha = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.medicamento.nombre} - {self.cantidad} unidades"
Tip
  • Formularios (forms.py)
from django import forms
from .models import Medicamento, Venta

class ContactForm(forms.Form):
    nombre = forms.CharField(label='Nombre', max_length=100)
    email = forms.EmailField(label='Email', max_length=100)
    mensaje = forms.EmailField(label='Mensaje', widget=forms.Textarea)

class MedicamentoForm(forms.ModelForm):
    class Meta:
        model = Medicamento
        fields = ['nombre', 'precio', 'existencias', 'lugar']

class VentaForm(forms.ModelForm):
    class Meta:
        model = Venta
        fields = ['medicamento','cantidad']
from django import forms
from .models import Medicamento

Paso 1: Mostrar la Lista de Medicamentos

Vista

  • Agrega la siguiente función en views.py:
1from django.shortcuts import render
2from .models import Medicamento

3def lista_medicamentos(request):
4    medicamentos = Medicamento.objects.all()
5    return render(request, 'farmacia/lista_medicamentos.html', {'medicamentos': medicamentos})
1
Importa la función render.
2
Importa el modelo Medicamento.
3
Define la función lista_medicamentos.
4
Obtiene todos los medicamentos.
5
Renderiza el template lista_medicamentos.html con la lista de medicamentos.

En esta función, se obtienen todos los medicamentos de la base de datos y se pasan al template para mostrarlos en una lista.

Template

  • Crea el archivo templates/farmacia/lista_medicamentos.html:
<!DOCTYPE html>
<html>
<head>
    <title>Lista de Medicamentos</title>
</head>
<body>
    <h1>Lista de Medicamentos</h1>
1    <a href="{% url 'crear_medicamento' %}">Añadir Medicamento</a>
    <ul>
2        {% for medicamento in medicamentos %}
        <li>
3            {{ medicamento.nombre }} - ${{ medicamento.precio }}
4            ({{ medicamento.existencias }} disponibles)
5            <a href="{% url 'detalle_medicamento' medicamento.id %}">Detalles</a>
6            <a href="{% url 'editar_medicamento' medicamento.id %}">Editar</a>
7            <a href="{% url 'eliminar_medicamento' medicamento.id %}">Eliminar</a>
        </li>
        {% endfor %}
    </ul>
</body>
</html>
1
Enlace para crear un nuevo medicamento.
2
Itera sobre la lista de medicamentos.
3
Muestra el nombre y precio del medicamento.
4
Muestra las existencias disponibles.
5
Enlace para ver los detalles del medicamento.
6
Enlace para editar el medicamento.
7
Enlace para eliminar el medicamento.

En este template, se muestra una lista de medicamentos con enlaces para ver los detalles, editar y eliminar

Ruta

  • En el archivo urls.py de la aplicación:
from django.urls import path
1from . import views

urlpatterns = [
2    path('medicamentos/', views.lista_medicamentos, name='lista_medicamentos'),
]
1
Importa las vistas.
2
Define la ruta para mostrar la lista de medicamentos.

En esta ruta, se llama a la función lista_medicamentos para mostrar la lista de medicamentos en la URL /medicamentos/.

Paso 2: Mostrar el Detalle de un Medicamento

Vista

  • Agrega esta función a views.py:
1from django.shortcuts import get_object_or_404

2def detalle_medicamento(request, id):
3    medicamento = get_object_or_404(Medicamento, id=id)
    return render(request, 'farmacia/detalle_medicamento.html', {'medicamento': medicamento})
1
Importa la función get_object_or_404.
2
Define la función detalle_medicamento.
3
Obtiene el medicamento con el ID especificado.

En esta función, se obtiene un medicamento específico por su ID y se pasa al template para mostrar sus detalles.

Template

  • Crea el archivo templates/farmacia/detalle_medicamento.html:
<!DOCTYPE html>
<html>
<head>
    <title>Detalle del Medicamento</title>
</head>
<body>
1    <h1>{{ medicamento.nombre }}</h1>
2    <p><strong>Precio:</strong> ${{ medicamento.precio }}</p>
3    <p><strong>Existencias:</strong> {{ medicamento.existencias }}</p>
4    <p><strong>Lugar:</strong> {{ medicamento.lugar }}</p>
5    <a href="{% url 'lista_medicamentos' %}">Volver a la lista</a>
</body>
</html>
1
Muestra el nombre del medicamento.
2
Muestra el precio del medicamento.
3
Muestra las existencias disponibles.
4
Muestra el lugar del medicamento.
5
Enlace para volver a la lista de medicamentos.

En este template, se muestran los detalles de un medicamento específico.

Ruta

  • En urls.py:
1path('medicamentos/<int:id>/', views.detalle_medicamento, name='detalle_medicamento'),
1
Define la ruta para mostrar el detalle de un medicamento específico.

En esta ruta, se llama a la función detalle_medicamento para mostrar los detalles de un medicamento en la URL /medicamentos/id/.

Paso 3: Crear un Medicamento

Vista

1from django.shortcuts import redirect
2from .forms import MedicamentoForm

3def crear_medicamento(request):
4    if request.method == 'POST':
5        form = MedicamentoForm(request.POST)
6        if form.is_valid():
7            form.save()
8            return redirect('lista_medicamentos')
    else:
9        form = MedicamentoForm()
10    return render(request, 'farmacia/crear_medicamento.html', {'form': form})
1
Importa la función redirect.
2
Importa el formulario MedicamentoForm.
3
Define la función crear_medicamento.
4
Verifica si la petición es de tipo POST.
5
Crea un formulario con los datos de la petición.
6
Verifica si el formulario es válido.
7
Guarda el medicamento en la base de datos.
8
Redirige a la lista de medicamentos.
9
Crea un formulario vacío.
10
Renderiza el template crear_medicamento.html con el formulario.

En esta función, se crea un nuevo medicamento a partir de los datos enviados por el usuario y se guarda en la base de datos.

Template

  • Crea templates/farmacia/crear_medicamento.html:
<!DOCTYPE html>
<html>
<head>
    <title>Crear Medicamento</title>
</head>
<body>
    <h1>Crear Medicamento</h1>
1    <form method="post">
2        {% csrf_token %}
3        {{ form.as_p }}
4        <button type="submit">Guardar</button>
    </form>
5    <a href="{% url 'lista_medicamentos' %}">Volver a la lista</a>
</body>
</html>
1
Formulario para crear un nuevo medicamento.
2
Token de seguridad.
3
Campos del formulario.
4
Botón para guardar el medicamento.
5
Enlace para volver a la lista de medicamentos.

En este template, se muestra un formulario para crear un nuevo medicamento.

Ruta

1path('medicamentos/nuevo/', views.crear_medicamento, name='crear_medicamento'),
1
Define la ruta para crear un nuevo medicamento.

En esta ruta, se llama a la función crear_medicamento para mostrar el formulario de creación de medicamentos en la URL /medicamentos/nuevo/.

Paso 4: Editar un Medicamento

Vista

1def editar_medicamento(request, id):
2    medicamento = get_object_or_404(Medicamento, id=id)
3    if request.method == 'POST':
4        form = MedicamentoForm(request.POST, instance=medicamento)
5        if form.is_valid():
6            form.save()
7            return redirect('lista_medicamentos')
    else:
8        form = MedicamentoForm(instance=medicamento)
9    return render(request, 'farmacia/editar_medicamento.html', {'form': form})
1
Define la función editar_medicamento.
2
Obtiene el medicamento con el ID especificado.
3
Verifica si la petición es de tipo POST.
4
Crea un formulario con los datos del medicamento.
5
Verifica si el formulario es válido.
6
Guarda los cambios en el medicamento.
7
Redirige a la lista de medicamentos.
8
Crea un formulario con los datos del medicamento.
9
Renderiza el template editar_medicamento.html con el formulario.

En esta función, se edita un medicamento existente a partir de los datos enviados por el usuario y se guardan los cambios en la base de datos.

Template

  • Crea templates/farmacia/editar_medicamento.html con el mismo diseño que el formulario de creación.

Ruta

1path('medicamentos/editar/<int:id>/', views.editar_medicamento, name='editar_medicamento'),
1
Define la ruta para editar un medicamento existente.

Paso 5: Eliminar un Medicamento

Vista

1def eliminar_medicamento(request, id):
2    medicamento = get_object_or_404(Medicamento, id=id)
3    medicamento.delete()
4    return redirect('lista_medicamentos')
1
Define la función eliminar_medicamento.
2
Obtiene el medicamento con el ID especificado.
3
Elimina el medicamento de la base de datos.
4
Redirige a la lista de medicamentos.

En esta función, se elimina un medicamento existente de la base de datos.

Ruta

1path('medicamentos/eliminar/<int:id>/', views.eliminar_medicamento, name='eliminar_medicamento'),
1
Define la ruta para eliminar un medicamento existente.

En esta ruta, se llama a la función eliminar_medicamento para eliminar un medicamento en la URL /medicamentos/eliminar/id/.

Ejecutar el Proyecto

  • Inicia el servidor:
python manage.py runserver
  • Visita las rutas mencionadas para probar cada funcionalidad. Con estos pasos, tendrás un CRUD básico funcionando en tu aplicación Django.

Podemos agregar vistas, templates y rutas adicionales para implementar más funcionalidades en la aplicación de farmacia, como la creación de ventas, la generación de reportes, etc.