Index: users/forms.py
===================================================================
--- users/forms.py	(revision bf6bc0bcaa9356a07e6d3842a68e4deda2da874d)
+++ users/forms.py	(revision be8d9179875eb0e2a87f6f6fbcc22e521eee281e)
@@ -30,4 +30,5 @@
     )
 from base.models import Municipio, Parroquia
+from .models import Perfil
 
 class LoginForm(forms.Form):
@@ -228,2 +229,47 @@
         model = User
         exclude = ['is_staff','is_active','date_joined']
+        
+class PerfilForm(forms.ModelForm):
+    """!
+    Formulario del perfil
+
+    @author Rodrigo Boet (rboet at cenditel.gob.ve)
+    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+    @date 24-04-2017
+    @version 1.0.0
+    """
+    def __init__(self, *args, **kwargs):
+        """!
+        Metodo que sobreescribe cuando se inicializa el formulario
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 24-04-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param args <b>{list}</b> Lista de los argumentos
+        @param kwargs <b>{dict}</b> Diccionario con argumentos
+        @return Retorna el formulario validado
+        """
+        super(PerfilForm, self).__init__(*args, **kwargs)
+        
+        self.fields['estado'].choices = cargar_entidad()
+        self.fields['municipio'].choices = cargar_municipios()
+        self.fields['parroquia'].choices = cargar_parroquias()
+    
+    ## cedula
+    cedula = CedulaField()
+    
+    ## estado
+    estado = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
+        'onchange': "actualizar_combo(this.value,'base','Municipio','entidad','codigo','nombre','id_municipio')"}))
+    
+    ## municipio
+    municipio = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',
+        'onchange': "actualizar_combo(this.value,'base','Parroquia','municipio','codigo','nombre','id_parroquia')"}))
+    
+    ## parroquia
+    parroquia = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control input-md',}))
+    
+    class Meta:
+        model = Perfil
+        exclude = ['user','parroquia']
Index: users/templates/perfil.update.html
===================================================================
--- users/templates/perfil.update.html	(revision be8d9179875eb0e2a87f6f6fbcc22e521eee281e)
+++ users/templates/perfil.update.html	(revision be8d9179875eb0e2a87f6f6fbcc22e521eee281e)
@@ -0,0 +1,65 @@
+{% extends 'consulta.base.html' %}
+{% load staticfiles %}
+{% block title %}Perfil{% endblock %}
+{% block contenido %}
+    <form action="" role="form" class="form form-horizontal validate-form" method="post" autocomplete="off">
+        {% csrf_token %}
+        <div class="row text-center">
+            <h1>Actualizar Perfil</h1><hr>
+            <div class="col-md-12 col-sm-12 col-xs-12">
+                <div class="form-group {% if form.cedula.errors %}has-error{% endif %}">
+                    <label class="col-md-3 col-xs-3 col-sm-3 control-label" for="{{ form.cedula.auto_id }}">
+                        {{ form.cedula.label }}
+                    </label>
+                    <div class="col-md-4 col-xs-4 col-sm-4">
+                      <div class="form-inline">
+                        {{ form.cedula }}
+                      </div>
+                        {% include 'base.forms.errors.html' with form_errors=form.cedula.errors col_title_error='col-sm-2' col_msg_error='col-sm-10' %}
+                    </div>
+                    <div class="col-sm-1"><i class="ion ion-ios-medical item-requerido"></i></div>
+                </div>
+            </div><br><br><br>
+            
+            <div class="col-md-4 col-sm-4 col-xs-4">
+                <div class="form-group {% if form.estado.errors %}has-error{% endif %}">
+                    <label class="col-md-3 col-xs-3 col-sm-3 control-label" for="{{ form.estado.auto_id }}">
+                        {{ form.estado.label }}
+                    </label>
+                    <div class="col-md-5 col-xs-5 col-sm-5">
+                        {{ form.estado }}
+                        {% include 'base.forms.errors.html' with form_errors=form.estado.errors col_title_error='col-sm-2' col_msg_error='col-sm-10' %}
+                    </div>
+                </div>
+            </div>
+            
+            <div class="col-md-4 col-sm-4 col-xs-4">
+                <div class="form-group {% if form.municipio.errors %}has-error{% endif %}">
+                    <label class="col-md-3 col-xs-3 col-sm-3 control-label" for="{{ form.municipio.auto_id }}">
+                        {{ form.municipio.label }}
+                    </label>
+                    <div class="col-md-5 col-xs-5 col-sm-5">
+                        {{ form.municipio }}
+                        {% include 'base.forms.errors.html' with form_errors=form.municipio.errors col_title_error='col-sm-2' col_msg_error='col-sm-10' %}
+                    </div>
+                </div>
+            </div>
+            
+            <div class="col-md-4 col-sm-4 col-xs-4">
+                <div class="form-group {% if form.parroquia.errors %}has-error{% endif %}">
+                    <label class="col-md-3 col-xs-3 col-sm-3 control-label" for="{{ form.parroquia.auto_id }}">
+                        {{ form.parroquia.label }}
+                    </label>
+                    <div class="col-md-5 col-xs-5 col-sm-5">
+                        {{ form.parroquia }}
+                        {% include 'base.forms.errors.html' with form_errors=form.parroquia.errors col_title_error='col-sm-2' col_msg_error='col-sm-10' %}
+                    </div>
+                </div>
+            </div><br><br><br><br><br><br>
+             <div class="col-md-12 col-sm-12 col-xs-12">
+                 <a type="button" class="btn btn-info pull-left" href="{% url 'consulta_index' %}">Regresar</a>
+                <button type="submit" class="btn btn-primary pull-right">Actualizar</button>
+             </div>
+        </div>
+    </form>
+{% endblock %}
Index: users/templates/user.register.html
===================================================================
--- users/templates/user.register.html	(revision bf6bc0bcaa9356a07e6d3842a68e4deda2da874d)
+++ users/templates/user.register.html	(revision be8d9179875eb0e2a87f6f6fbcc22e521eee281e)
@@ -105,9 +105,8 @@
                       {{ form.estado.label }}
                   </label>
-                  <div class="col-md-4 col-xs-4 col-sm-4">
+                  <div class="col-md-5 col-xs-5 col-sm-5">
                       {{ form.estado }}
                       {% include 'base.forms.errors.html' with form_errors=form.estado.errors col_title_error='col-sm-2' col_msg_error='col-sm-10' %}
                   </div>
-                  <div class="col-sm-1"><i class="ion ion-ios-medical item-requerido"></i></div>
               </div>
           </div>
@@ -118,9 +117,8 @@
                       {{ form.municipio.label }}
                   </label>
-                  <div class="col-md-4 col-xs-4 col-sm-4">
+                  <div class="col-md-5 col-xs-5 col-sm-5">
                       {{ form.municipio }}
                       {% include 'base.forms.errors.html' with form_errors=form.municipio.errors col_title_error='col-sm-2' col_msg_error='col-sm-10' %}
                   </div>
-                  <div class="col-sm-1"><i class="ion ion-ios-medical item-requerido"></i></div>
               </div>
           </div>
@@ -131,9 +129,8 @@
                       {{ form.parroquia.label }}
                   </label>
-                  <div class="col-md-4 col-xs-4 col-sm-4">
+                  <div class="col-md-5 col-xs-5 col-sm-5">
                       {{ form.parroquia }}
                       {% include 'base.forms.errors.html' with form_errors=form.parroquia.errors col_title_error='col-sm-2' col_msg_error='col-sm-10' %}
                   </div>
-                  <div class="col-sm-1"><i class="ion ion-ios-medical item-requerido"></i></div>
               </div>
           </div><br><br><br>
Index: users/urls.py
===================================================================
--- users/urls.py	(revision bf6bc0bcaa9356a07e6d3842a68e4deda2da874d)
+++ users/urls.py	(revision be8d9179875eb0e2a87f6f6fbcc22e521eee281e)
@@ -14,5 +14,5 @@
 # @version 1.0
 from django.conf.urls import url
-from .views import LoginView, LogoutView, RegisterView
+from .views import *
 
 urlpatterns = [
@@ -20,3 +20,4 @@
     url(r'^logout$', LogoutView.as_view(), name = "logout"),
     url(r'^register$', RegisterView.as_view(), name = "register"),
+    url(r'^update/(?P<pk>\d+)$', PerfilUpdate.as_view(), name = "update"),
 ]
Index: users/views.py
===================================================================
--- users/views.py	(revision bf6bc0bcaa9356a07e6d3842a68e4deda2da874d)
+++ users/views.py	(revision be8d9179875eb0e2a87f6f6fbcc22e521eee281e)
@@ -13,12 +13,13 @@
 # @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
 # @version 1.0
-from django.shortcuts import render
-from django.views.generic import FormView, RedirectView, CreateView
+from django.shortcuts import render, redirect
+from django.views.generic import FormView, RedirectView, CreateView, UpdateView
 from django.contrib.auth.mixins import LoginRequiredMixin
+from django.contrib.messages.views import SuccessMessageMixin
 from django.contrib.auth import authenticate, logout, login
 from django.core.urlresolvers import reverse_lazy
 from django.contrib.auth.models import User, Group
 from django.contrib import messages
-from .forms import LoginForm, UserRegisterForm
+from .forms import LoginForm, UserRegisterForm, PerfilForm
 from .models import Perfil
 from base.models import Parroquia
@@ -99,5 +100,5 @@
 
 
-class RegisterView(FormView):
+class RegisterView(SuccessMessageMixin,FormView):
     """!
     Muestra el formulario de registro de usuarios
@@ -111,4 +112,5 @@
     form_class = UserRegisterForm
     success_url = reverse_lazy('login')
+    success_message = "Se registrÃ³ con Ã©xito"
     model = User
 
@@ -144,2 +146,84 @@
         
         return super(RegisterView, self).form_valid(form)
+    
+class PerfilUpdate(SuccessMessageMixin,LoginRequiredMixin,UpdateView):
+    """!
+    Clase que gestiona la actualizaciÃ³n del perfil
+
+    @author Rodrigo Boet (rboet at cenditel.gob.ve)
+    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+    @date 24-04-2017
+    @version 1.0.0
+    """
+    model = Perfil
+    template_name = "perfil.update.html"
+    form_class = PerfilForm
+    success_message = "Se actualizÃ³ el perfil con Ã©xito"
+    
+    def dispatch(self, request, *args, **kwargs):
+        """
+        Metodo que redirecciona al usuario si no cuenta con los permisos
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 24-04-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param request <b>{object}</b> Objeto que contiene la peticiÃ³n
+        @param args <b>{object}</b> Objeto que contiene los argumentos
+        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
+        @return: Direcciona al 403 si no es su perfil
+        """
+        if int(self.request.user.id) != int(self.kwargs['pk']):
+            return redirect('base_403')
+        return super(PerfilUpdate, self).dispatch(request, *args, **kwargs)
+    
+    def get_success_url(self):
+        """!
+        Metodo que permite definir la url de direcciÃ³n al ser vÃ¡lido el formulario
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 24-04-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @return Retorna la url
+        """
+        return reverse_lazy('update',
+                            kwargs={'pk': self.kwargs['pk']})
+    
+    def get_initial(self):
+        """!
+        Metodo para agregar valores de inicio al formulario
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 24-04-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @return Retorna los valores iniciales
+        """
+        initial = super(PerfilUpdate, self).get_initial()
+        perfil = Perfil.objects.get(pk=self.kwargs['pk'])
+        initial['parroquia'] = perfil.parroquia_id
+        initial['municipio'] = perfil.parroquia.municipio_id
+        initial['estado'] = perfil.parroquia.municipio.entidad_id
+    
+        return initial
+    
+    def form_valid(self,form):
+        """!
+        Metodo que valida si el formulario es valido
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 24-04-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param form <b>{object}</b> Objeto que contiene el formulario de registro
+        @return Retorna el formulario validado
+        """
+        parroquia = Parroquia.objects.get(id=form.cleaned_data['parroquia'])
+        
+        self.object = form.save()
+        self.object.cedula = form.cleaned_data['cedula']
+        self.object.parroquia = parroquia
+        self.object.save()
+        
+        return super(PerfilUpdate, self).form_valid(form)
