Como hago un response personalizado

189 views
Skip to first unread message

Diego Uribe Gamez

unread,
Oct 19, 2012, 3:29:55 PM10/19/12
to djan...@googlegroups.com
La cuestión es que tengo un botón que hace una acción en una vista y lo que quiero es simplemente que le muestre un mensaje en el navegador al usuario de que ya se hizo esa acción, como cuando le salen a uno los mensajes de error en ciertas paginas o algo así, como puedo hacer esto?

Lo que sucede es que la vista por obligación me pide hacer un response, y lo que quiero es únicamente que se ejecute el código en python, o si se puede hacer un response a la plantilla sin hacer un render seria genial, como cambiar una imagen en forma de bombillo verde a rojo cuando se ejecute esa acción?

Saludos.

--
 Diego Alonso Uribe Gamez

Desarrollador web

Twitter: @DiegoUG

Google+: http://gplus.to/diegoug




Miguel

unread,
Oct 19, 2012, 3:35:57 PM10/19/12
to djan...@googlegroups.com
Ya intentaste usar ajax?

--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.



--
ISC. JMSM



Angel Alvarez

unread,
Oct 19, 2012, 3:53:07 PM10/19/12
to djan...@googlegroups.com
Yo lo hago con un flag. Utilizo una variable booleana  y en el template pregunto por esa variable.

--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.



--
Angel C. Alvarez

Diego Uribe Gamez

unread,
Oct 19, 2012, 4:50:19 PM10/19/12
to djan...@googlegroups.com
Lo del flag es interesante, pero igual no entiendo bien como lo haces, yo estoy intentando hacer un json de confirmación, que la vista ejecute el codigo json y que el template desde donde se hizo la consulta capture el json diciendo que ya se ejecuto el codigo, pero lo que pasa es que me abre la url de la vista con el texto json? algo estoy haciendo mal y no se que es.

template de consulta:

                <form ="/app/comandos/" method="POST">
                {% csrf_token %}
                    <input type="hidden" name="config" value="{{configpy}}"/>
                    <button id='reset' type="submit" value="Comando" alt='COMAND'></button>
                </form>

Javascript, template de consulta:

    <script type="text/javascript">
        $.getJSON('app/comandos/',
            function(data){
              if (data["HTTPRESPONSE"] == 1)
              {
                  alert("success")
              }
            });
    </script>

vista app/comandos:

def app_comandos(request):
    ..........
        json_data = json.dumps({"HTTPRESPONSE":1})
        return HttpResponse(json_data, mimetype="application/json")

Diego Uribe Gamez

unread,
Oct 22, 2012, 11:19:27 PM10/22/12
to djan...@googlegroups.com
Nada que logro capturar el Json de Django con el javascript? alguna idea de que estoy haciendo mal?

Gracias.

Diego Uribe Gamez

unread,
Oct 23, 2012, 7:41:38 AM10/23/12
to djan...@googlegroups.com
Bueno, sigo con el problema:

Como les comente antes tengo un form que ejecuta una vista, esta vista no es la misma vista donde esta esta consulta y lo que hace esta vista es retornar un json, la idea es que el htm muestre que ya se realizo la accion de esta vista (app_comandos) sin irse de la vista actual.

En este momento la vista (app_comandos) se ejecuta correctamente, yo intente acoplar este ejemplo:
Sin exito, ya que sigue mandándome a vista app_comandos, donde me muestra únicamente en pantalla: {"HTTPRESPONSE": 1}

Al principio pensaba que lo que sucedía era que no estaba iniciando el jquery pero igual no me sale.

Como hago para que se iniciarse el form y que no me saque de la url actual, si no que simplemente consulte el json y me muestre una alerta que si se realizo esta acción?

Buscando una respuesta a esta pregunta me encontré con este ejemplo http://jsfiddle.net/sxGtM/ de un formulario que bota un json pero igual no esta apuntando a ningún lado, ademas que no entiendo muy bien como adaptarlo.

template de consulta:

                <form ="/app/comandos/" method="POST">
                {% csrf_token %}
                    <input type="hidden" name="config" value="{{configpy}}"/>
                    <button id='reset' type="submit" value="Comando" alt='COMAND'></button>
                </form>

Javascript, template de consulta:

    <script type="text/javascript">
        $.getJSON('app/comandos/',
            function(data){
              if (data["HTTPRESPONSE"] == 1)
              {
                  alert("success")
              }
            });
    </script>

vista app/comandos:

def app_comandos(request):
    ..........
        json_data = json.dumps({"HTTPRESPONSE":1})
        return HttpResponse(json_data, mimetype="application/json")

Gracias.

Diego Uribe Gamez

unread,
Oct 23, 2012, 7:45:28 AM10/23/12
to djan...@googlegroups.com
Disculpen, el ejemplo del form que funciona es este: http://jsfiddle.net/sxGtM/3/

Carlos Luis Jordán Murillo

unread,
Oct 23, 2012, 2:00:22 PM10/23/12
to djan...@googlegroups.com
Mira te recomiendo que utilices esto



$.ajax({
url: path,
async:true,
data:{"numero_pagina":1,"numero_filas":10,"palabra":palabra},
beforeSend: function(objeto){
   //alert("Adiós, me voy a ejecutar");
},
complete: function(objeto, exito){
   //alert("Me acabo de completar")
   if(exito=="success"){
//alert("Y con éxito");
contentboxcontent.html("");
var table_build = jQuery.parseJSON(objeto.responseText);
        // arreglo de respuesta(table_build);

   }
},
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function(objeto, quepaso, otroobj){
   alert("Estas viendo esto por que fallé");
   alert("Pasó lo siguiente: "+quepaso);
},
global: true,
ifModified: false,
processData:true,
success: function(response){
   //alert(response.obje)
},
timeout: 3000,
type: "GET"
});



y en el json puedes enviar lo siguiente

def path(request):


        data_table_pers = {"mensaje":"hola"}
        json_dumps = json.dumps({"resultado":True, "data_table":data_table_pers })
    
        return HttpResponse(json_dumps, mimetype="application/json")


MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
-----> borrar linea    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)


si te sale un error de metodología post tienes que borrar la siguiente línea



El 23 de octubre de 2012 09:37, Roberto Urita Jimenez <robe...@gmail.com> escribió:
Lo que pasa es que tienes que hacerlo con AJAX, es un formulario y siempre se ira a donde tenga apuntado el action="".

La solucion es simple, javascript o aun mejor, jquery.

Te voy a dar un ejemplo de como lo haria yo.

Este es mi formulario en html.

<form id="idForm" action="/app/comandos/" method="POST">
#Recuerda el CSRF
{% csrf_token %}
<input type="hidden" name="config" value="{{configpy}}"/>
 <button id='reset' type="submit" value="Comando" alt='COMAND'></button>
</form>

Ahora el javascript

<script type="text/javascript>

$(document).ready(function(){

// Aquí tienes que utilizar el vento del click para el boton

    $("#reset").on("click",function(event){
          // Con este comando, le quitas el evento por default que realiza dicho boton. Esto es seguramente uno de tus problemas, con esto ya no se envia el form
          event.preventDefault();
          // Ahora toma los valores que necestas.
          var _url = $("#idForm").attr("action");
          // Django te exige en cualquier peticion el csrf_token,  así es que lo tienes que enviar. 
                         //Si pones tu javascript en el mismo template usa esto
          var _token = {{csrf_token}}
                        // Si no pues ponlo como un hidden y captura el valor con javascript

           //Ahora solo has tu peticion con ajax.
          // No se te olvide enviar el token, asi como lo siguiente. Las variables que utilices y por ultimo el token. Esto te lo exige django
          var data = '{ 'variable':suvalor, 'variable':suvalor,'csrfmiddlewaretoken':_token  }';
$.ajax({
  url: _url,
  dataType: 'json',
  data: data,
  success: function(data){
                       alert( data.unodemisvaloresdejson );
 }
});
    });
});

</script>

Ahora vamonos a la vista 

Importa esto

from django.http import HttpResponse

def nombredemifuncion(request):
        if request.is_ajax():
            if request.method = "POST":
                 // Has lo que se neceste con las variables.



--
Saludos
Carlos Jordán
Ingeniero  
Escuela Superior Politécnica del Litoral
Ciencias Computacionales especialización Sistemas de Información

lord.carcas

unread,
Oct 27, 2012, 1:24:33 AM10/27/12
to djan...@googlegroups.com
Hola borrar el csrf no es muy buena idea por seguridad recuerda que quitarlo poner vulnerable tu aplicacion
a este tipo de ataque. me parece mejor el ejemplo de Roberto

saludos

Elio Rincón

unread,
Oct 27, 2012, 9:51:31 AM10/27/12
to djan...@googlegroups.com
 No hay necesidad de eliminar el csrf middleware, solo debes enviar el csrf token en la petición con los datos que envías. 

 Un ejemplo que acabo de hacer.

 type: "POST",  
 url: "{% url comentar_ajax %}",  
 data: {
     'comentario':c, 
     'id_articulo':{{articulo.id}},
     csrfmiddlewaretoken: '{{ csrf_token }}'
 },

Saludos.

Carlos Luis Jordán Murillo

unread,
Oct 27, 2012, 10:03:53 AM10/27/12
to djan...@googlegroups.com
Bien la verdad no sabía que podíamos poner esas líneas =D Saludos

--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
Reply all
Reply to author
Forward
0 new messages