Tutorial para Crear un Blog Funcional con Django y Bootstrap: Desarrollo Web para Principiantes
Si estás empezando en el mundo del desarrollo web y quieres crear un blog funcional usando Python, este tutorial es para ti. Aquí aprenderás a configurar un proyecto Django desde cero, construir los modelos, implementar las vistas y plantillas, y darle un diseño moderno y responsivo con Bootstrap. Además, te mostraremos cómo manejar formularios para crear y editar posts, y finalmente te guiaremos sobre cómo realizar un despliegue básico.
¡Sigue este proyecto Django paso a paso y domina los fundamentos del desarrollo web con Django y Bootstrap!
Índice
- Instalación y Configuración Inicial de Django
- Creación de Modelos para las Entradas del Blog
- Implementación de Vistas y URLs
- Plantillas y Diseño con Bootstrap
- Manejo de Formularios para Agregar y Editar Posts
- Despliegue Básico de la Aplicación
- Conclusión y Buenas Prácticas
Instalación y Configuración Inicial de Django
Paso 1: Crear un entorno virtual
Es recomendable usar un entorno virtual para gestionar las dependencias de Python sin afectar el sistema global.
1 2 3 |
python3 -m venv blogenv source blogenv/bin/activate # En Windows: blogenv\Scripts\activate |
Paso 2: Instalar Django
1 2 |
pip install django |
Verificamos la instalación:
1 2 |
django-admin --version |
Paso 3: Crear el proyecto Django
1 2 3 |
django-admin startproject mi_blog cd mi_blog |
Paso 4: Crear la aplicación para el blog
1 2 |
python manage.py startapp blog |
Paso 5: Registrar la aplicación en settings.py
Edita mi_blog/settings.py
y añade 'blog',
en INSTALLED_APPS
:
1 2 3 4 5 |
INSTALLED_APPS = [ ... 'blog', ] |
Paso 6: Ejecutar el servidor para verificar
1 2 |
python manage.py runserver |
Abre en tu navegador: http://127.0.0.1:8000/
para ver la página de bienvenida de Django.
Creación de Modelos para las Entradas del Blog
Paso 1: Definir el modelo Post
En blog/models.py
, crea el modelo para las entradas del blog:
1 2 3 4 5 6 7 8 9 10 11 |
from django.db import models from django.utils import timezone class Post(models.Model): titulo = models.CharField(max_length=200) # Título del post contenido = models.TextField() # Cuerpo del post fecha_publicacion = models.DateTimeField(default=timezone.now) # Fecha def __str__(self): return self.titulo |
Paso 2: Crear y aplicar migraciones
1 2 3 |
python manage.py makemigrations blog python manage.py migrate |
Esto crea la tabla correspondiente en la base de datos.
Implementación de Vistas y URLs
Paso 1: Crear vistas en blog/views.py
Crear las vistas para listar posts y mostrar detalle:
1 2 3 4 5 6 7 8 9 10 11 |
from django.shortcuts import render, get_object_or_404 from .models import Post def lista_posts(request): posts = Post.objects.order_by('-fecha_publicacion') return render(request, 'blog/lista_posts.html', {'posts': posts}) def detalle_post(request, pk): post = get_object_or_404(Post, pk=pk) return render(request, 'blog/detalle_post.html', {'post': post}) |
Paso 2: Configurar URLs
Crea un archivo blog/urls.py
:
1 2 3 4 5 6 7 8 |
from django.urls import path from . import views urlpatterns = [ path('', views.lista_posts, name='lista_posts'), path('post/<int:pk>/', views.detalle_post, name='detalle_post'), ] |
Incluye las URLs de la app en mi_blog/urls.py
:
1 2 3 4 5 6 7 8 |
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')), ] |
Plantillas y Diseño con Bootstrap
Paso 1: Estructura de templates
Crea la carpeta blog/templates/blog/
y dentro crea:
base.html
lista_posts.html
detalle_post.html
Paso 2: Añadir Bootstrap a base.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{% block title %}Mi Blog{% endblock %}</title> <!-- Bootstrap CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container-fluid"> <a class="navbar-brand" href="/">Mi Blog Django</a> </div> </nav> <div class="container mt-4"> {% block content %}{% endblock %} </div> <!-- Bootstrap JS Bundle --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> </body> </html> |
Paso 3: Crear la plantilla para la lista de posts
lista_posts.html
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{% extends 'blog/base.html' %} {% block title %}Inicio - Mi Blog{% endblock %} {% block content %} <h1>Entradas del Blog</h1> <div class="list-group"> {% for post in posts %} <a href="{% url 'detalle_post' post.pk %}" class="list-group-item list-group-item-action"> <h5>{{ post.titulo }}</h5> <small class="text-muted">Publicado el {{ post.fecha_publicacion|date:"d M Y H:i" }}</small> <p>{{ post.contenido|truncatechars:100 }}</p> </a> {% empty %} <p>No hay posts disponibles.</p> {% endfor %} </div> {% endblock %} |
Paso 4: Crear la plantilla para el detalle del post
detalle_post.html
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{% extends 'blog/base.html' %} {% block title %}{{ post.titulo }} - Mi Blog{% endblock %} {% block content %} <article> <h1>{{ post.titulo }}</h1> <p class="text-muted">Publicado el {{ post.fecha_publicacion|date:"d M Y H:i" }}</p> <div> {{ post.contenido|linebreaks }} </div> <a href="/" class="btn btn-secondary mt-3">Volver al listado</a> </article> {% endblock %} |
Verifica que al entrar a http://127.0.0.1:8000/
veas la lista de entradas con estilo Bootstrap.
Manejo de Formularios para Agregar y Editar Posts
Paso 1: Crear el formulario usando Django Forms
En blog/forms.py
, añade:
1 2 3 4 5 6 7 8 9 10 11 12 |
from django import forms from .models import Post class PostForm(forms.ModelForm): class Meta: model = Post fields = ['titulo', 'contenido'] widgets = { 'titulo': forms.TextInput(attrs={'class': 'form-control'}), 'contenido': forms.Textarea(attrs={'class': 'form-control', 'rows': 5}), } |
Paso 2: Crear vistas para agregar y editar
En blog/views.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from django.shortcuts import redirect from .forms import PostForm # Agregar nuevo post def crear_post(request): if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): form.save() return redirect('lista_posts') else: form = PostForm() return render(request, 'blog/crear_post.html', {'form': form}) # Editar un post existente def editar_post(request, pk): post = get_object_or_404(Post, pk=pk) if request.method == 'POST': form = PostForm(request.POST, instance=post) if form.is_valid(): form.save() return redirect('detalle_post', pk=post.pk) else: form = PostForm(instance=post) return render(request, 'blog/editar_post.html', {'form': form}) |
Paso 3: Añadir URLs para crear y editar
En blog/urls.py
:
1 2 3 4 5 6 7 |
urlpatterns = [ path('', views.lista_posts, name='lista_posts'), path('post/<int:pk>/', views.detalle_post, name='detalle_post'), path('post/nuevo/', views.crear_post, name='crear_post'), path('post/<int:pk>/editar/', views.editar_post, name='editar_post'), ] |
Paso 4: Crear las plantillas
crear_post.html
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{% extends 'blog/base.html' %} {% block title %}Crear Post - Mi Blog{% endblock %} {% block content %} <h2>Crear Nueva Entrada</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit" class="btn btn-primary">Guardar</button> <a href="/" class="btn btn-secondary">Cancelar</a> </form> {% endblock %} |
editar_post.html
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{% extends 'blog/base.html' %} {% block title %}Editar Post - Mi Blog{% endblock %} {% block content %} <h2>Editar Entrada</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit" class="btn btn-success">Actualizar</button> <a href="{% url 'detalle_post' form.instance.pk %}" class="btn btn-secondary">Cancelar</a> </form> {% endblock %} |
Paso 5: Añadir links para Crear y Editar en las plantillas
En lista_posts.html
(lista el link crear):
1 2 |
<a href="{% url 'crear_post' %}" class="btn btn-primary mb-3">Nueva Entrada</a> |
En detalle_post.html
, para editar:
1 2 |
<a href="{% url 'editar_post' post.pk %}" class="btn btn-warning mt-3">Editar Entrada</a> |
Despliegue Básico de la Aplicación
Para pruebas en local o despliegue inicial:
Paso 1: Configurar el archivo requirements.txt
1 2 |
pip freeze > requirements.txt |
Paso 2: Configuración para producción (opcional)
- Cambiar
DEBUG=False
ensettings.py
- Configurar
ALLOWED_HOSTS
con el dominio o IP
Paso 3: Opciones básicas de despliegue
Puedes usar:
- Heroku para despliegue gratuito sencillo
- PythonAnywhere para hosting Django
Paso 4: Usar servidor simple para producción (solo pruebas)
1 2 |
python manage.py runserver 0.0.0.0:8000 |
Pero para producción en real es mejor usar servidores especializados como Gunicorn y Nginx.
Conclusión y Buenas Prácticas
En este tutorial paso a paso para crear un blog con Django y Bootstrap has aprendido:
- Configurar y crear un proyecto Django desde cero
- Definir modelos para manejar entradas de blog
- Desarrollar vistas y urls básicas para listar y mostrar contenido
- Implementar plantillas usando Bootstrap para diseño responsivo y elegante
- Utilizar formularios para agregar y editar posts fácilmente
- Primeros pasos para desplegar la aplicación
Buenas Prácticas que debes seguir:
- Utiliza entornos virtuales para gestionar dependencias
- Escribe código limpio y modular (separa lógica en vistas, modelos y formularios)
- Aprovecha el sistema de plantillas para reutilizar código con bloques
- Valida y sanitiza siempre los datos recibidos en formularios
- Usa control de versiones (como Git) para mantener el historial del proyecto
¿Qué sigue?
- Añadir funcionalidades como comentarios o categorías
- Mejorar el SEO y rendimiento de tu sitio
- Profundizar en despliegues usando Docker, Gunicorn y Nginx