Skip to content

Models ‐ Categoria,Post,Comentario,MensajeContacto,Profile

Guillermo Nicolás Petcho edited this page Oct 11, 2024 · 1 revision

Modelos de datos utilizando Django ORM (Object-Relational Mapping):

Importaciones

from tkinter import Image
from django.db import models
from django.utils import timezone
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password

Se utilizo tkinter Imagen porque utilice un codigo aparte para verificar el estado de la Base de Datos y no es necesario

  1. from tkinter import Image: Este import es innecesario en el contexto de Django y podría ser un error, ya que tkinter es una biblioteca para interfaces gráficas de usuario en Python, no se utiliza en el contexto de Django.

  2. from django.db import models: Importa el módulo models de Django, que se utiliza para definir modelos de base de datos.

  3. from django.utils import timezone: Importa el módulo timezone, que permite trabajar con fechas y horas en el contexto de zonas horarias.

  4. from django.conf import settings: Permite acceder a la configuración del proyecto de Django, incluyendo la configuración de autenticación.

  5. from django.contrib.auth.models import User: Importa el modelo User, que representa la tabla de usuarios en la base de datos.

  6. from django.contrib.auth.hashers import make_password: Permite hashear contraseñas de manera segura (aunque en este código no se utiliza directamente).


Definición de Modelos

1. Modelo Categoria

class Categoria(models.Model):
    nombre = models.CharField(max_length=200, unique=True)

    def __str__(self):
        return self.nombre
  • Descripción: Este modelo representa las categorías que pueden asignarse a los posts.
  • Campo nombre:
    • models.CharField: Campo de texto que almacena el nombre de la categoría, con un límite de 200 caracteres.
    • unique=True: Garantiza que no haya dos categorías con el mismo nombre.
  • Método __str__: Devuelve el nombre de la categoría cuando se imprime o se visualiza.

2. Modelo Post

class Post(models.Model):
    autor = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    titulo = models.CharField(max_length=200)
    resumen = models.TextField(max_length=50000)
    fecha_creacion = models.DateTimeField(default=timezone.now)
    fecha_publicacion = models.DateTimeField(blank=True, null=True)
    contenido = models.TextField(max_length=50000)
    imagen = models.ImageField(null=True, blank=True, upload_to="img/posts", help_text="Imagen del post")
    categorias = models.ManyToManyField(Categoria, related_name="posts")

    def publish(self):
        self.fecha_publicacion = timezone.now()
        self.save()

    def __str__(self):
        return self.titulo
    
    def mostrarcomentario(self):
        return self.comentarios.filter(aprobado=True)
  • Descripción: Este modelo representa los posts o publicaciones en el sistema.
  • Campos:
    • autor:
      • ForeignKey: Crea una relación de muchos a uno con el modelo de usuario.
      • on_delete=models.CASCADE: Si se elimina el usuario, se eliminarán también todos sus posts.
    • titulo: Campo que almacena el título del post.
    • resumen: Un campo de texto que proporciona un resumen del contenido del post.
    • fecha_creacion: Almacena la fecha y hora de creación del post, con un valor predeterminado de la hora actual.
    • fecha_publicacion: Campo opcional que indica cuándo se publicó el post.
    • contenido: Campo que almacena el contenido completo del post.
    • imagen: Campo que permite subir una imagen asociada al post. Puede ser nulo o estar en blanco.
    • categorias: Relación de muchos a muchos con el modelo Categoria, permitiendo que un post tenga múltiples categorías y viceversa.
  • Métodos:
    • publish(): Método que establece la fecha_publicacion al momento actual y guarda el post.
    • __str__(): Devuelve el título del post cuando se imprime.
    • mostrarcomentario(): Devuelve los comentarios aprobados asociados al post.

3. Modelo Comentario

class Comentario(models.Model):
    autor_comentario = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    post = models.ForeignKey("Post", related_name='comentarios', on_delete=models.CASCADE)

    cuerpo_comentario = models.CharField(max_length=1000)
    fecha_creacion = models.DateTimeField(default=timezone.now)
    aprobado = models.BooleanField(default=True)

    def aprobar_comentario(self):
        self.aprobado = True
        self.save()

    def __str__(self):
        return f'Comentario de {self.autor_comentario} en {self.post}'
  • Descripción: Este modelo representa los comentarios realizados en los posts.
  • Campos:
    • autor_comentario: Relación de muchos a uno con el modelo de usuario, representando al autor del comentario.
    • post: Relación de muchos a uno con el modelo Post, indicando a qué post pertenece el comentario.
    • cuerpo_comentario: Campo que almacena el texto del comentario.
    • fecha_creacion: Almacena la fecha y hora de creación del comentario, con un valor predeterminado de la hora actual.
    • aprobado: Campo booleano que indica si el comentario ha sido aprobado (valor predeterminado True).
  • Métodos:
    • aprobar_comentario(): Cambia el estado de aprobado a True y guarda el comentario.
    • __str__(): Devuelve una representación del comentario que incluye el autor y el post.

4. Modelo MensajeContacto

class MensajeContacto(models.Model):
    nombre = models.CharField(max_length=100)
    email = models.EmailField()
    tema = models.CharField(max_length=50)
    mensaje = models.TextField()
    archivo = models.FileField(upload_to='archivos/', blank=True, null=True)  # Para archivos opcionales
    fecha_envio = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.nombre
  • Descripción: Este modelo se utiliza para almacenar mensajes de contacto enviados por los usuarios.
  • Campos:
    • nombre: Nombre del usuario que envía el mensaje.
    • email: Dirección de correo electrónico del usuario.
    • tema: Tema del mensaje.
    • mensaje: Contenido del mensaje.
    • archivo: Campo que permite subir un archivo opcionalmente.
    • fecha_envio: Almacena la fecha y hora en que se envió el mensaje, configurado para agregarse automáticamente.
  • Método __str__(): Devuelve el nombre del remitente del mensaje.

5. Modelo Profile

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    photo = models.ImageField(null=True, blank=True, upload_to="img/posts", help_text="Imagen del perfil")
    encrypted_password = models.CharField(max_length=128, blank=True, null=True)  # Campo para almacenar la contraseña encriptada

    def __str__(self):
        return self.user.username

    def save(self, *args, **kwargs):
        if self.user.password and not self.encrypted_password:
            self.encrypted_password = self.user.password  # Almacena la contraseña encriptada del usuario
        super(Profile, self).save(*args, **kwargs)
  • Descripción: Este modelo representa el perfil del usuario, vinculando información adicional al modelo de usuario.
  • Campos:
    • user: Relación uno a uno con el modelo User, lo que significa que cada usuario tiene un único perfil.
    • bio: Campo de texto que permite al usuario añadir una breve biografía. Es opcional.
    • photo: Campo para almacenar la imagen de perfil del usuario. También es opcional.
    • encrypted_password: Almacena la contraseña encriptada del usuario, aunque es poco común almacenar contraseñas en perfiles. Este campo es opcional.
  • Métodos:
    • __str__(): Devuelve el nombre de usuario del perfil.
    • save(): Se sobrescribe el método save para almacenar la contraseña encriptada del usuario en el campo encrypted_password cuando se crea el perfil.

Resumen General

Este código define varios modelos que forman la base de una aplicación de gestión de contenido. Cada modelo tiene sus campos y métodos que ayudan a gestionar la información de manera estructurada. Las relaciones entre modelos (como ForeignKey y ManyToManyField) permiten una mayor flexibilidad y organización en la base de datos.