martes, 30 de abril de 2019

Cursos a 9.99 hasta 05/05/2019




En ocasión de celebrarse el día internacional de los trabajadores he decidido activar nuevamente los descuento de los cursos, a $9.99 o el menor para tu país, por tiempo y cupones limitados. Comparte con tus amigos estos cupones y así también puedan disfrutar de este descuento por tiempo limitado.

Cualquier curso $9.99 hasta el 05/05/2019.  Utiliza el cupón DIA_TRABAJADOR.
Te dejo lista de los cursos agrupadas por temática, para más información click en el nombre del curso







Así mismo te informo que estoy elaborando un curso para el cual, estaré ofreciendo algunos cupones 100% FREE a los que se hayan inscrito en mis cursos con cupones de descuento, así que ya sabes, invita a tus amigos para puedan optar por esta promoción una vez el curso esté finalizado. El curso se titulará
Consumir Web Service RestFul Api desde varias plataformas



Bueno, eso es todo por hoy, espero aproveches estos descuentos o compartas con amigos.  Feliz Día Internacional de los Trabajadores.

Saludos y hasta la próxima

viernes, 19 de abril de 2019

Mis Redes Sociales




Click sobre cada imagen para ser redigirido a la red social, para que estés enterado de cualquier promoción, artículo, video o documento que comparta.

          

        


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

miércoles, 27 de marzo de 2019

Curso Gratis Construye WebApi con ASP Dot Net

Curso Gratis por tiempo y cupones limitados.

En el curso Construye Web Api con ASP Net Core y Visual Studio Code, aprenderás las bases para realizar tu propio Web Service WebApi (RestFul API) con el nuevo framework de Microsoft, llamado ASP Net Core.  Además está hecho para hacer todo el proyecto completo utilizando Visual Studio Code, con el cual no tendrás dependencia de otro editor ni de sistema operativo.

Si no has alcanzado cupones gratis, puedes aún acceder a un super descuento del 90% utilizando el cupón WEBAPI_1_2019 o haciendo click en el siguiente botón
Inscríbete

Además, no te pierdas de las promociones en los demás cursos.  Todos al precio menor para tu país.

RestFul Api con Python usando Django Rest FrameWork
$9.99
Inscríbete
Construye Web Api con ASP Net core y Visual Studio Code
 
$9.99
Inscríbete
Desarrollo Web con Python usando Django para Principiantes
$9.99
Inscríbete
Replicación de Base de Datos con SymmetricDS
 
$9.99
Inscríbete
Entity FrameWork para Principiantes
 
$9.99
Inscríbete
Domina el ORM de Django


$9.99
Inscríbete
Programación en Capas Web y Escritorio con ADO Net
$9.99
Inscríbete

Para Acceder al cupón, comparte con el siguiente botón


lunes, 25 de marzo de 2019

Entornos Virtuales Python - Windows y Linux

#python #django #VirtualEnv #desarrollo #web #restapi #apirest #restful

En esta ocasión, seguimos con los tips de python.  Toca el tema de Entornos Virtuales y para que quede mejor, les dejo un video.  Para cualquier aplicación que vayamos a hacer en Python, yo recomiendo crear un entorno virtual, ¿pero qué es?  ¿cómo se usa?  Entérate en el siguiente video.





Este video, es útil para realizar aplicaciones web, por ejemplo te dejo el enlace a tres cursos de desarrollo web con django, espero puedas inscribirte.



lunes, 18 de marzo de 2019

Calendario jQuery DateTimePicker en Formulario Django


#jQuery #datepicker #python #django #calendar

Algo muy importante al momento de trabajar con fechas y formularios, es evitar la tediosa tarea de validar si la fecha es válida o no.  Esto influye en varios fallos al momento de procesar, ya que el usuario puede ingresar texto u otro dato que no es necesariamente el formato que estamos esperando.

En este tutorial, te explicaré cómo usar un plugin (de muchos que hay por ahí) de jQuery para el manejo de fechas/horas en el FrontEnd.

Trabajaremos con XDSoft DateTimePicker, pueden encontrar la documentación en este enlace o el código fuente acá para que puedan ampliar funcionalidades.

En el curso de Desarrollo Web con Python usando Django, construimos un formulario de facturación, el cual recibe una fecha de forma manual (indicada por el usuario).

Trabajaremos la forma de integrar el plugin con un formulario de Django.  Que al final no es tan complicado, porque Django es Python y éste último trabaja bajo el principio de hacer desarrollo rápido de aplicaciones.

base.html

Este archivo es nuestra plantilla base y está ubicada en templates/base/, acá es donde haremos la primera parte del trabajo.

En el head, agregaremos la referencia a la hoja de estilo

 <!-- XDSoft DateTimePicker -->  
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.min.css" integrity="sha256-DOS9W6NR+NFe1fUhEE0PGKY/fubbUCnOfTje2JMDw3Y=" crossorigin="anonymous" />  


Y al final del archivo base, agregar el llamado a la librería, eso si, deben estar pendiente que si no lo ponen como última línea, por lo menos esté después de haber cargado la librería para jQuery.


 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js" integrity="sha256-FEqEelWI3WouFOo2VWP/uJfs1y8KJ++FLh2Lbqc8SJk=" crossorigin="anonymous"></script>  

Para poder permitir ingresar código javascript en las plantillas que hereden de base.html, crearemos un bloque que llamaré scripts_local y lo dejaremos vacío, el bloque lo dejé al final de la plantilla.

  {% block scripts_local %}  
  {% endblock scripts_local %}  


Con esto, ya deberíamos de poder trabajar, para esto iremos al siguiente archivo a procesar, el formulario de Django

forms.py

Acá no hay mucho que cambiar a lo que se ha hecho en el curso, sólo pondremos el input de la fecha de sólo lectura


class FacturaEncForm(forms.ModelForm):  
   fecha_factura = forms.DateInput()  
   class Meta:  
     model = FacturaEnc  
     fields = ['fecha_factura', 'observacion']  
   def __init__(self, *args, **kwargs):  
     super().__init__(*args, **kwargs)  
     for field in iter(self.fields):  
       self.fields[field].widget.attrs.update({  
         'class': 'form-control'  
       })  
     self.fields['fecha_factura'].widget.attrs['readonly'] = True  


Pueden ver que eso se logró en la última línea y campo de formulario se llama fecha_factura.

Ahora vamos a inicializar el plugin, justo en el archivo del template donde se renderiza el formulario.

factura_form.html

Acá nos iremos directamente al bloque creado en la plantilla base.
Inicializaremos el plugin, daremos formato a la fecha y quitaremos la sección de hora (time)

 {% block scripts_local %}  
 <script>  
  $(function () {  
   $("#id_fecha_factura").datetimepicker({  
       format: 'd/m/Y',  
       timepicker:false  
   });  
  });  
 </script>  
 {% endblock scripts_local %}  

El nombre usado id_fecha_factura, es del formato de django de nombrar los inputs en la plantilla, la cual es la plabra id seguido del guión bajo y el nombre del elemento del formulario.

Y listo, ya con esto deberíamos poder trabajar con el plugin jQuery los campos fechas.

Locale (Idioma)

Aunque ya está listo, sólo haría falta que muestre los datos en nuestro idioma, según la documentación, se debe invocar la función SetLocale y para que sea de forma global, lo hice en la plantilla base, al final agregué el llamado al idioma español (es), pero bien puede ser cualquier otro idioma.

   <script>  
     $(document).ready(function () {  
           jQuery.datetimepicker.setLocale('es');  
     });  
   </script>  

Y ya con esto tenemos la implementación de un plugin jQuery para el manejo del formato de la fecha en nuestro proyecto hecho en Django.


Si estás interesado en el curso, no te pierdas esta oportunidad de tenerlo con un 95% de descuento desde el siguiente botón.


sábado, 16 de marzo de 2019

Nuevo Curso RestFul WebApi con Asp Net Core y Visual Studio Code


RestFul Web Api con ASP Net Core y Visual Studio Code

En este nuevo curso, aprenderás a realizar un Web Service utilizando únicamente Visual Studio Code como editor. 

✓ Desarrollo de una WebApi ✓ CRUD con Verbos HTTP ✓ Autenticación Json Web Token ✓ Servicio de Usuario ✓ VS Code 100%  ✓ Código fuente en GitHub y BitBucket

Por introducción se ofrece con un 90% de descuento utilizando el cupón (WEBAPI_1_2019) provisto en el siguiente botón, por tiempo limitado.

Curso en constante actualización, próximamente se agregarán más clases extras. 

 90% Descuento

 
>