Table of Contents
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Creacion del Blog
Crear app python3 manage.py startapp blog
Crear el modelo, una clase por elemento de las entradas del blog
/blog/models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Categoria(models.Model):
nombre = models.CharField( max_length = 50 )
created = models.DateTimeField( auto_now_add = True)
updated = models.DateTimeField( auto_now_add = True)
class Meta:
verbose_name = 'categoria'
verbose_name_plural = 'categorias'
def __str__(self):
return self.nombre
class Entrada(models.Model):
titulo = models.CharField( max_length = 50 )
contenido = models.CharField( max_length = 50 )
autor = models.ForeignKey( User, on_delete = models.CASCADE )
categorias = models.ManyToManyField( Categoria )
imagen = models.ImageField( upload_to='blog', null=True, blank=True )
created = models.DateTimeField( auto_now_add = True)
updated = models.DateTimeField( auto_now_add = True)
class Meta:
verbose_name = 'entrada'
verbose_name_plural = 'entradas'
def __str__(self):
return self.titulo
Relación uno a muchos.
- Un User puede tener muchas entradas ForeignKey(User, on_delete=models.CASCADE)
en este caso al eliminar un usuario, se eliminan sus entradas
Relación muchos a muchos.
- Una categoría puede estar en varias entradas, y
- Una entrada puede pertencer varias categorias ManyToManyField()
Registrar app Blog
settings.py
...
INSTALLED_APPS = [
...
'blog',
]
...
Crear migraciones y Migrar:
🔸️python3 admin.py makemigrations
🔸️python3 admin.py migrate
Administrar Blog
Crear las clases a administrar y registrar sitio en admin.py
from django.contrib import admin
from .models import Categoria, Entrada
# Register your models here.
class CategoriaAdmin(admin.ModelAdmin):
readonly_fields = ('created', 'updated')
class EntradasAdmin(admin.ModelAdmin):
readonly_fields = ('created', 'updated')
admin.site.register(Categoria, CategoriaAdmin)
admin.site.register(Entrada, EntradasAdmin)
Configurar vistas y urls
-
Trasladar la vista del blog desde views.py del proyecto, al de la app y modificar ruta "blog/blog.html"
/ProyectoWebApp/views.py
from django.shortcuts import render, HttpResponse def home(request): return render(request, "ProyectoWebApp/home.html") def tienda(request): return render(request, "ProyectoWebApp/tienda.html") def contacto(request): return render(request, "ProyectoWebApp/contacto.html") def sample(request): return render(request, "ProyectoWebApp/sample.html")
blog/views.py
from django.shortcuts import render # Create your views here. def blog(request): return render(request, "blog/blog.html")
-
Mover y modificar template, a /blog/template/blog**
Crear estructura de directorios
📂️ blog ├── 📂️ migrations │ └── 📄️ __init__.py ├── 📂️ templates │ └── 📂️ blog │ └── 📄️ blog.html ├── 📄️ __init__.py ├── 📄️ admin.py ├── 📄️ apps.py ├── 📄️ models.py ├── 📄️ tests.py ├── 📄️ urls.py └── 📄️ views.py
-
Mover y modificar /ProyectoWebApp/urls.py y crear urls a la plantilla
Quitar ruta
path('blog', views.....
de ProyectoWebApp/urls.py -
Registrar url al urls.py general del proyecto
ProyectoWeb/urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('ProyectoWebApp.urls')), path('servicios/', include('servicios.urls')), path('blog/', include('blog.urls')), ]
-
Crear urls en la aplicacion
/blog/urls.py
from django.shortcuts import render from blog.models import Entrada # Create your views here. def blog(request): entradas = Entrada.objects.all() return render(request, "blog/blog.html", {"entradas":entradas})
-
Editar plantilla
/blog/blog.html
{% extends 'ProyectoWebApp/base.html' %} {% load static %} {% block content %} {% for entrada in entradas %} <!-- Heading --> <section class="page-section clearfix"> <div class="container"> <div class="intro"> <img class="intro-img img-fluid mb-3 mb-lg-0 rounded" src="{{entrada.imagen.url}}" alt="" style="width: 70%;"> <div class="intro-text left-0 text-center bg-faded p-5 rounded"> <h2 class="section-heading mb-4" > <span class="section-heading-upper">{{entrada.titulo}}</span> <span class="section-heading-lower" style="color: Tomato;">{{entrada.contenido}}</span> </h2> </div> </div> </div> </section> {% endfor %} {% endblock %}