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:
- 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"- 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 MedicamentoPaso 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.