Mostrando las entradas con la etiqueta Clase Extra. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Clase Extra. Mostrar todas las entradas

miércoles, 31 de julio de 2024

🎁 Contenerizar Aplicación Django 🐍 | Clase: Dockerfile

 



El día 05/08/2024  actualizaré el curso de Sistema de Compra y Facturación con una sección donde te mostraré cómo contenerizar una aplicación Django usando Docker.

Así que, atento a ese día.   Mientras tanto he subido una clase a mi canal de YouTube, si estás interesado en verla, puedes acceder a este enlace (https://youtu.be/nagXH1A7X38)  en esta clase gratis  veremos la creación del archivo Dockerfile.

Puedes compartir este mensaje a tus amigos, para que puedan acceder a la clase gratis.  👇


https://youtu.be/nagXH1A7X38




Suscríbete para estar enterado

* indicates required

Intuit Mailchimp

miércoles, 14 de agosto de 2019

Django - Uso de Plugin Select2 para Filtrar con Auto Completado



En esta ocasión mostraré cómo utilizar el Plugin Select2 para filtrar en una caja select de html, para sustituir la tradicional lista.







💪¿Deseas aprender #Desarrollo #Web?

📢Hazlo con uno de los mejores cursos publicado en @udemy_es
con 🐍 #Python y #Django.

🏆El más completo

💰Aprovecha descuento 95% por tiempo limitado. Precio más bajo.


⚡️Gracias por compartir

jueves, 4 de abril de 2019

Ventanas Modales con Django usando Bootstrap y Vistas Basadas en Clases




Como podrás ver en las imágenes del inicio, este artículo trata de poder adaptar el proyecto desarrollado con Python usando Django, para utilizar ventanas modales.

Primero lo primero, debemos tener las librerías necesarias agregadas al proyecto.  Esto sería, jQuery y BootStrap.

<!-- Bootstrap Core CSS -->
<link rel="stylesheet" href="{% static 'base/css/bootstrap.min.css' %}">

<!-- jQuery -->
<script src="{% static 'base/js/jquery.min.js' %}"></script>

<!-- Bootstrap Core JavaScript -->
<script src="{% static 'base/js/bootstrap.min.js' %}"></script>


Luego, ya el proyecto en Django, trabajaremos con las SubCategoría, así que el proyecto contiene lo siguiente:

models.py
class SubCategoria(ClaseModelo):
categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE)
descripcion = models.CharField(
max_length=100,
help_text='Descripción de la Sub Categoría'
)

def __str__(self):
return '{}:{}'.format(self.categoria.descripcion,self.descripcion)

def save(self):
self.descripcion = self.descripcion.upper()
super(SubCategoria, self).save()

class Meta:
verbose_name_plural = "Sub Categorías"
unique_together = ('categoria','descripcion')


views.py
class SubCategoriaView(LoginRequiredMixin, generic.ListView):
model = SubCategoria
template_name = "catalogos/subcategoria_list.html"
context_object_name = 'obj'
login_url = 'generales:login'


class SubCategoriaNew(SinPrivilegios, LoginRequiredMixin, generic.CreateView):
permission_required = "catalogos.add_subcategoria"
model = SubCategoria
template_name = "catalogos/subcategoria_form.html"
context_object_name = 'obj'
form_class = SubCategoriaForm
success_url = reverse_lazy("catalogos:subcategoria_list")


class SubCategoriaEdit(SinPrivilegios, generic.UpdateView):
permission_required = "catalogos.change_subcategoria"
model = SubCategoria
template_name = "catalogos/subcategoria_form.html"
context_object_name = 'obj'
form_class = SubCategoriaForm
success_url = reverse_lazy("catalogos:subcategoria_list")

urls.py
path('subcategorias', SubCategoriaView.as_view() , name='subcategoria_list'),
path('subcategorias/new', SubCategoriaNew.as_view() , name='subcategoria_new'),
path('subcategorias/edit/<int:pk>', SubCategoriaEdit.as_view(),
name='subcategoria_edit'),

Ahora debemos de hacer algunos cambios en el proyecto, principalmente en la plantilla base (puede ser en una plantilla específica, pero prefiero que ya esté habilitado para cualquier plantilla que herede de la base).  En dicha plantilla agregaremos dos cosas:
  • El div donde se "renderizará" la ventana modal
  • Funciones en JavaScript necesarias para abrir y cerrar la ventana modal
Todo lo anterior, lo puse al final del body de la plantilla base.



base.html
<div id="ventana_modal" class="modal fade" role="dialog"></div>

<script>
function abrir_modal(url)
{
$('#ventana_modal').load(url, function()
{
$(this).modal({
backdrop: 'static',
keyboard: false
})
$(this).modal('show');
});
return false;
}

function cerrar_modal()
{
$('#ventana_modal').modal('hide');
return false;
}
</script>

Notar que la función encargada de abrir el modal, tiene también la tarea de activar las opciones backdrop y keyboard, esto le indica a la ventana modal de bootstrap que no se cierre al hacer click fuera de ella.

El div con id ventana_modal, es donde se "renderizará" la plantilla y tiene el efecto fade, para cuando se cargue dicho modal.

Ahora, debemos corregir las plantillas, para que se haga el llamado a la función abrir_modal y ésta a su vez despliegue la ventana modal.

A como pudiste haber visto en el archivo de rutas, para mostrar todas las categorías se utiliza la ruta llamada subcategoria_list, quien a su vez utiliza la vista SubCategoriaView, donde está declarada la plantilla catalogos/subcategoria_list.html, la cual es la encargada de mostrar todas las subcategorías y a su vez posee los botones para crear o editar y a la vez hereda de la plantilla base.

subcategoria_list.html
{% extends 'base/base.html' %} {% block page_header %} Listado de Sub Categorías {% endblock page_header %}
{% block contenido %}
<div class="panel panel-default">
<div class="panel-heading">
<a class="btn btn-warning" onclick="return abrir_modal('{% url 'catalogos:subcategoria_new' %}')" href="#"><span class="fa fa-plus-circle"></span> Nueva SubCategoría en PopPup</a>
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<table width="100%" class="table table-striped table-bordered table-hover" id="dataTables-example">
<thead>
<tr>
<th>Id</th>
<th>Categoría</th>
<th>Descripción</th>
<th>Estado</th>
<th>Creado</th>
<th>Modificado</th>
<th class="all">Acciones</th>
</tr>
</thead>
<tbody>
{% for item in obj %}
<tr>
<td>{{item.id}}</td>
<td>{{item.categoria}}</td>
<td>{{item.descripcion}}</td>
<td>{{item.activo|yesno:"Activo,Inactivo"}}</td>
<td>{{item.creado|date:'d/m/Y H:i'}}</td>
<td>{{item.modificado|date:'d/m/Y H:i'}}</td>
<td>
<a onclick="return abrir_modal ('{% url 'catalogos:subcategoria_edit' item.id %}')" class="btn btn-primary btn-circle" href="#">
<span class="fa fa-edit"></span>
</a>
<a href="{% url 'catalogos:categoria_del' item.id %}" class="btn btn-danger btn-circle">
<span class="fa fa-trash"></span>
</a>
</td>
</tr>
{% endfor%}
</tbody>
</table>
</div>
</div>
{% endblock contenido%}

De esta plantilla debes notar los botones para nueva y editar subcategoría.

<a class="btn btn-warning"  
onclick="return abrir_modal('{% url 'catalogos:subcategoria_new' %}')" 
href="#"><span class="fa fa-plus-circle">
</span> Nueva SubCategoría en PopPup 
</a>


<a  
onclick="return abrir_modal ('{% url 'catalogos:subcategoria_edit' item.id %}')" 
class="btn btn-primary btn-circle" href="#">
<span class="fa fa-edit"></span>
</a>


En cada uno de los botones se hace el llamado a la función abrir_modal, a quien se la pasa la ruta a mostrar.

Aunque ambas rutas apunten a dos vistas de clases diferentes, porque una hará el INSERT y la otra el UPATE. Lo que si tienen en común es que ambas utilizan la plantilla catalogos/subcategoria_form.html


Esta plantilla es igual a las que hayas podido trabajar en tus proyectos y es igual a la que trabajamos en el curso de Desarrollo Web con Python usando Django, con la diferencia que en el form se debe indicar como acción la ruta de la url para cada acción, por tanto se hace un pequeño truco, si la variable de contexto obj existe, quiere decir que el formulario hará una actualización, porque trae registros, si por lo contrario no existe, quiere decir que obj no existe o está vacío y se tratará de una inserción de registros.

{% if obj %}
<form role="form" action="{% url 'catalogos:subcategoria_edit' obj.pk %}" method="post" class="form-inline">
{% else %}
<form role="form" action="{% url 'catalogos:subcategoria_new' %}" method="post" class="form-inline">
{% endif %}

Este punto es muy importante, sino no podrás guardar o editar, el contenido completo del archivo es:

subcategoria_form.html
<div class="modal-dialog modal-lg">
<div class="modal-content">
{% if obj %}
<form role="form" action="{% url 'catalogos:subcategoria_edit' obj.pk %}" method="post" class="form-inline">
{% else %}
<form role="form" action="{% url 'catalogos:subcategoria_new' %}" method="post" class="form-inline">
{% endif %}
<div class="panel panel-default">
<div class="panel-heading">
Editar/Crear Categoría
</div>
<!-- /.panel-heading -->
<div class="panel-body">
{% csrf_token %} {{form.as_p}}
<button type="submit" class="btn btn-danger"><span class="fa fa-save"></span> Guardar</button>
<a href="{% url 'catalogos:subcategoria_list' %}" class="btn btn-success"><span class="fa fa-undo"></span> Cancelar</a>
</div>
</div>
</form>
</div>
</div>


Noten que esta plantilla NO HEREDA de base, ya que si lo hiciera, se mostrará la plantilla completa y no se verá el "efecto" modal, es por esa razón que no hereda.

Otro detalle son los dos primeros div de la plantilla, completan la estructura de una ventana modal de bootstrap (con los cierres correspondientes).

<div class="modal-dialog modal-lg">
<div class="modal-content">



Ya con eso podrás implementar ventanas modales de bootstrap utilizando Vistas Basadas en Clases.

El código fuente completo forma parte del curso Desarrollo Web con Python usando Django, curso en constante actualización y si te registras desde este sitio, obtendrás un 95% de descuento del precio total.  De USD 199.99 a sólo USD 9.99 o menos según el país donde te encuentres.

Te animo a inscribirte, ya que es un curso en constante actualización.
http://bit.ly/dj-3-2019-95p


También puedes ver otros dos cursos sobre Django, en los cuales se amplían el conocimiento y se explota más este magífico FrameWork para Web de Python.





Elabora RestFul API con Python usando Django Rest FrameWork



http://bit.ly/ORM4-2019





Domina el ORM de Django, para que sepas manejar mejor la forma en que Django interactúa con tu Motor de Base de Datos.
http://bit.ly/RestFulDjango022019

sábado, 9 de marzo de 2019

Django - Revisar Permisos de Usuario desde el Template

#Clase #Gratis #Curso #Web #Python #Django #Permisos #Template

En esta ocasión les dejo una clase extra y gratuita del curso de Desarrollo Web con Python usando Django.

Veremos cómo poder revisar los permisos del usuario desde la plantilla, esto es desde el FrontEnd.


Puedes inscribirte en el curso haciendo click en el siguiente botón con un descuento del 95%, para dejarlo al precio más bajo asignado para tu país.
 95% Descuento

sábado, 15 de diciembre de 2018

Deploy Django 2.1 en Ubuntu Server 18.04 con Apache2

https://goo.gl/8uZwhf
#Deploy #Django2.1 #Django #Ubuntu #Ubuntu18.04 #Apache2 #Clase #Gratis #Curso #Python

Nuevamente por acá, esta vez con un artículo que espero les sea de interés.  Como hemos estado viendo en el curso de Desarrollo Web con Python usando Django 2.1 (click acá para ir al curso), hace falta hacer el deploy de nuestra aplicación a algún servidor de producción.

En esta ocasión, mostraré cómo realizar ese deploy en un Servidor Ubuntu con Apache2.  Veremos qué debemos instalar o actualizar y cómo pasar nuestro proyecto a dicho servidor.

Primero debemos revisar qué versión de python3 está instalado, aunque en el curso trabajamos con python 3.7, podemos hacer el deploy sobre python 3.6 que es la versión que viene por defecto en Ubuntu.



Antes de realizar cualquier acción debemos actualizar los repositorios

Luego procedemos a instalar python3 y python-dev, en el caso de python3 se actualizará a la última versión de 3.6 y el python-dev son herramientas que se requieren para el deploy.



Luego instalaremos apache2, quien será el servidor web encargado de "procesar"  los archivos estáticos, se apoya del módulo wsgi, que interpretará los archivos de python.



Para poder instalar el módulo wsgi, debemos agregar repositorio universe.


 Y luego instalamos el módulo de apache que interpreta python, libapache2-mod-wsgi-py3



Ahora instalaremos el módulo de Python3 que servirá para crear el entorno virtual, ya que estamos con python 3.6 es necesario instalarlo, python 3.7 ya lo trae integrado.



Ahora copiaremos nuestro proyecto al nuevo servidor, para esto primero creé un directorio en el home de mi usuario en Ubuntu



Copio el proyecto con el comando PSCP de putty.



Y así ya está copiado en el servidor.



Creamos el entorno virtual, esta vez utilizando buenas prácticas lo hacemos dentro de la carpeta del proyecto.



En mi caso, quise instalar offline los paquetes, por tanto bajé de pypi.org, todos los paquetes a instalar y los pasé al servidor Ubuntu.



Ahora activo el entorno virtual para instalar dentro de él todos las aplicaciones/módulos/paquetes descargados anteriormente.



Procedo a instalar todos los paquetes.



 Incluyendo ReportLab con su dependencia (Pillow)



Verificamos que estén todos los requeridos para nuestra aplicación



La base de datos, la tendré en otro servidor, por eso actualizo la ruta de acceso y credenciales hacia la base de datos, recuerden que en el servidor de base de datos deben dar acceso a este nuevo servidor.



Para poder hacer pruebas, instalé un navegador de consola llamado lynx, la idea principal es arrancar el servidor y navegar en la aplicación, pero como el server únicamente corre local, no es posible verlo desde fuera del equipo de desarrollo, por tal motivo, decidí bajar esta aplicación, no es necesario que Uds. lo hagan, en mi caso lo hice para confirmar que la aplicación levanta bien en el nuevo entorno (Ubuntu).



Arrancar el servidor local, aparcen algunos warnings, pero no es tan necesario preocupase por ellos. Lo importante es que veamos que el servidor arrancó.



Abrí otra ventana de mi consola (ya saben que uso CMDER) y me conecté al mismo servidor, utilicé lynx para poder navegar en el servidor local de Django.



Pruebo que el servidor cargue y que tenga acceso a la base de datos.





Finalmente, cuando veo que cargó bien, procedo a desactivar el entorno virtual, ya en este punto, sé que el servidor está corriendo perfectamente.



Ahora procedemos a trabajar con el servidor apache. Primero que todo, pasamos (copiamos) el proyecto (con el entorno virtual) hacia los directorios de apache en un directorio nuevo llamado vhosts.


Luego cambiamos los permisos sobre el directorio vhosts, al grupo www-data. En la siguiente imágen vemos el antes y el después.



Ahora vamos a editar el archivo de configuración del sitio por default que trae apache.



En este punto es donde redireccionamos python para que levante con el entorno virtual, esto es, la versión de python contenida en el entorno virtual.



Importante es el alias que se define hacia la ruta donde están los archivos estáticos, luego se requiere permisos full sobre esa carpeta y sobre la carpeta del proyecto (en mi caso demo) y sobre el archivo wsgi.py que es el archivo de configuración que ya trae python.

Finalizamos la edición del archivo configurando el módulo de apache para python, con las líneas
WSGIDeamonProcess, WSGIProcessGroup y WSGIScriptAlias, notar la ruta que deben actualizar para su propio interés.

Luego debemos reiniciar apache y para revisar que todo ande bien, mostramos los errores, se debe tener en claro que cada vez que se cambie algo de python (sea contenido o configuración), se debe reiniciar el servidor apache.




Intenamos acceder a la aplicación desde afuera y vemos que nos aparece un error.



En efecto, hacía falta cambiar los hosts autorizados para levantar nuestro




Ahora volvemos a reiniciar el sevidor y mostramos el log de errores.



Vemos que todo bien y volvemos a acceder desde otra terminal (o pc) a nuestra aplicación y si hemos seguido al pie de la letra esta clase, deberíamos de poder ver algo como lo siguiente.



Accedemos para ver si funciona bien y si está accediendo a la base de datos.

Y a como dije, vemos que todo levanta bien.


También vemos que la reportería esté funcionando.




Y con esto ya tenemos nuestra aplicación desplegada en un servidor externo al equipo que usamos para desarrollo y que puede ser accedido por otras personas.  Ya podemos decir que nuestro proyecto está desplegado en Ubuntu Server con Apache. 

Esta opción bien podría compararse a contratar un VPS de Digital Ocean (por ejemplo) o un servidor de producción personalizado.

Aún quedan más clases extras del curso, veremos más adelante cómo realizar el despliegue en otras plataformas, si estás interesado en recibir notificaciones, registrate en la ventana popup que sale o en el siguiente espacio.







También recuerda estar atento a mis redes sociales, especialmente Facebook, Youtube (esta clase tendrá un video ahí), Twitter y Tumblr.




 
>