Hola Antonio: Nosotros hicimos capacitación de Django, hice algunos sistemitas básicos, pero justo hubo cambio de autoridades y se compro software de SIU (Sistemas Información Ciudadana) en postgresql y php (framework Toba, también de SIU). Me asignaron un poco la parte de gestión de bd (algo así como DBA). Me aboque ha realizar un aplicativo de análisis de las bd en python (interfaz con TKinter) porque dichos aplicativos tienen bd complejas (+400 tablas cada uno) y no perfectamente normalizadas-documentadas.
Resumiendo lo que hace Django:
Vos definís la bd a nivel objetos, usando clases de django, configuras como se puede acceder al aplicativo generado (rutas válidas navegador). El django te genera todos los abcm (altas, bajas, consultas, modificaciones) básicos (inclusive html, css y js), inclusive las altas encadenadas, relaciones 1 a muchos y muchos a muchos. La integridad referencial te la maneja según lo declares en la bd (mediante las clases)
A eso le podes agregar reglas de negocios (en python).
O sea que lo básico te lo arma rápidamente (depende del hardware y el tamaño de la bd).
Si cambias el modelo de datos, django te hace la migración de la bd, y es reversible (o sea cambias el modelo, te hace la migración, pero podes "des-migrar, retrotrayendo al modelo previo, y más también pero ya no es tan simple).
Ahora estoy trabajando con Flask que es un miniframework para web sobre python, tiene la ventaja de que es mucho más simple que django (la aplicación a desarrollar trabaja con tres tablas (es casi gestor de contenidos que maneja unos 200 registros en la tabla principal y pienso montarlo sobre SQLite, ya que no maneja transacciones).
Laravel no lo conozco, hace +5 años no trabajo con PHP.
te paso la definición del modelo en django de un sistema de turnos
from django.db import models
import datetime
import random
class Sector(models.Model):
nombre = models.CharField(max_length=120)
lapso = models.PositiveIntegerField('Lapso')
def __str__(self):
return "{0}".format(self.nombre)
class Meta:
verbose_name = "Sector"
verbose_name_plural = "Sectores"
class Tramite(models.Model):
nombre = models.CharField(max_length=120)
requisitos = models.CharField(max_length=12288)
def __str__(self):
return "{0}".format(self.nombre)
class Meta:
verbose_name = "Tramite"
verbose_name_plural = "Tramites"
class Turno(models.Model):
ESTADO = ((1, 'Reservado'), (2, 'Confirmado'))
sector = models.ForeignKey(Sector)
dni = models.IntegerField()
apellidos = models.CharField(max_length=35)
nombres = models.CharField(max_length=30)
correo = models.CharField('Correo Electrónico', max_length=120)
fijo = models.CharField('Teléfono Fijo', max_length=50, blank=True, null=True)
celular = models.CharField('Teléfono Celular', max_length=50)
domicilio = models.CharField('Domicilio', max_length=80)
nacimiento = models.DateField('Fecha Nacimiento')
tramite = models.ForeignKey(Tramite)
fecha_turno = models.DateField('Fecha Turno')
hora_turno = models.CharField(max_length=5)
numero_turno = models.PositiveIntegerField('N° Turno', default=0)
token = models.CharField(max_length=5, default='')
reserva = models.DateField()
confirma = models.DateField()
estado = models.PositiveIntegerField(choices=ESTADO, default=1)
recordatorio = models.DateTimeField()
def __str__(self):
return "{0} | {1}, {2}".format(self.dni, self.apellidos, self.nombres)
class Meta:
verbose_name = "Turno"
verbose_name_plural = "Turnos"
def numerodeturno(self, fecha):
''' Número de Turno para una Fecha '''
numero = Turno.objects.filter(fecha_turno=fecha).count()
if numero == None:
return 1
else:
return numero + 1
def clavesecreta(self, longitud):
""" Genera cadena aleatorias """
caracteres = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
return ''.join(random.choice(caracteres) for _ in range(longitud))
def save(self):
self.sector = 1 # Fijo la Dirección de Tránsito por ahora.
self.numero_turno = self.numerodeturno(datetime.datetime.today())
self.token = self.clavesecreta(5)
super().save()
aca va lo que tienes definir para crear todos los abcm
from django.contrib import admin
from web.models import *
admin.site.register(Sector)
admin.site.register(Tramite)
class TurnoAdmin(admin.ModelAdmin):
fields = ('dni', 'apellidos', 'nombres', 'correo', 'fijo', 'celular', 'domicilio', 'nacimiento',
'tramite', 'fecha_turno', 'hora_turno')
admin.site.register(Turno, TurnoAdmin)
esta es la parte de las vistas
from django.http import HttpResponse
from django.template import RequestContext, loader
from django.conf import settings
def index(request):
t = loader.get_template('index.html')
c = RequestContext(request)
return HttpResponse(t.render(c))
Y acá el html del index
{% extends "base.html" %}
{% load static %}
{% block contenido %}
<nav class="navbar navbar-static-top marginBottom-0" role="navigation">
<div class="navbar-header">
<a class="navbar-brand" href="#" target="_blank">Municipalidad de Santa Rosa</a>
</div>
<nav class="navbar navbar-default" role="navigation">
<!-- El logotipo y el icono que despliega el menú se agrupan
para mostrarlos mejor en los dispositivos móviles -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse"
data-target=".navbar-ex1-collapse">
<span class="sr-only">Desplegar navegación</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Logotipo</a>
</div>
<!-- Agrupar los enlaces de navegación, los formularios y cualquier
otro elemento que se pueda ocultar al minimizar la barra -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Enlace #1</a></li>
<li><a href="#">Enlace #2</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Menú #1 <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="#">Acción #1</a></li>
<li><a href="#">Acción #2</a></li>
<li><a href="#">Acción #3</a></li>
<li class="divider"></li>
<li><a href="#">Acción #4</a></li>
<li class="divider"></li>
<li><a href="#">Acción #5</a></li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-left" role="search">
<div class="form-group">
<input type="text" class="form-control" placeholder="Buscar">
</div>
<button type="submit" class="btn btn-default">Enviar</button>
</form>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">Enlace #3</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Menú #2 <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="#">Acción #1</a></li>
<li><a href="#">Acción #2</a></li>
<li><a href="#">Acción #3</a></li>
<li class="divider"></li>
<li><a href="#">Acción #4</a></li>
</ul>
</li>
</ul>
</div>
</nav>
</nav>
{% endblock %}
Falta algunos archivos más que no puedo pasar porque estarían mostrando contraseñas y otras configuraciones que por razones obvias no se pueden mostrar.
Pero te da una idea de que toda la parafernalia de abcm lo armas con relativamente codificación.
Conclusión, si vas a realizar un sistema complejo, Django es aplicable, para aplicaciones muy chicas, la curva de aprendizaje inicial es alta, no por lo dificil, si no por lo abundante. (como levantar un tarro de dulce de leche con una grúa portuaria)
Saludos: Miguel