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):
= models.CharField(max_length=100)
nombre = models.DecimalField(max_digits=10, decimal_places=2)
precio = models.IntegerField()
existencias = models.CharField(max_length=100)
lugar = models.DateTimeField(auto_now=True)
fecha
def __str__(self):
return self.nombre
class Venta(models.Model):
= models.ForeignKey(Medicamento, on_delete=models.CASCADE)
medicamento = models.IntegerField()
cantidad = models.DateTimeField(auto_now=True)
fecha
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):
= forms.CharField(label='Nombre', max_length=100)
nombre = forms.EmailField(label='Email', max_length=100)
email = forms.EmailField(label='Mensaje', widget=forms.Textarea)
mensaje
class MedicamentoForm(forms.ModelForm):
class Meta:
= Medicamento
model = ['nombre', 'precio', 'existencias', 'lugar']
fields
class VentaForm(forms.ModelForm):
class Meta:
= Venta
model = ['medicamento','cantidad']
fields 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= Medicamento.objects.all()
medicamentos 5return 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'medicamentos/', views.lista_medicamentos, name='lista_medicamentos'),
path( ]
- 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= get_object_or_404(Medicamento, id=id)
medicamento 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:
1'medicamentos/<int:id>/', views.detalle_medicamento, name='detalle_medicamento'), path(
- 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):
4if request.method == 'POST':
5= MedicamentoForm(request.POST)
form 6if form.is_valid():
7
form.save()8return redirect('lista_medicamentos')
else:
9= MedicamentoForm()
form 10return 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
1'medicamentos/nuevo/', views.crear_medicamento, name='crear_medicamento'), path(
- 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= get_object_or_404(Medicamento, id=id)
medicamento 3if request.method == 'POST':
4= MedicamentoForm(request.POST, instance=medicamento)
form 5if form.is_valid():
6
form.save()7return redirect('lista_medicamentos')
else:
8= MedicamentoForm(instance=medicamento)
form 9return 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
1'medicamentos/editar/<int:id>/', views.editar_medicamento, name='editar_medicamento'), path(
- 1
- Define la ruta para editar un medicamento existente.
Paso 5: Eliminar un Medicamento
Vista
1def eliminar_medicamento(request, id):
2= get_object_or_404(Medicamento, id=id)
medicamento 3
medicamento.delete()4return 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
1'medicamentos/eliminar/<int:id>/', views.eliminar_medicamento, name='eliminar_medicamento'), path(
- 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.