Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/06/2011, 02:53
ajamaica
 
Fecha de Ingreso: junio-2011
Mensajes: 5
Antigüedad: 12 años, 10 meses
Puntos: 10
Agregando botones al {% submit_row %} en change_form.html en el panel de Django

Este es un problema que se me presento hoy y como lo resolvi. Sucede que requería agregar un botón de Commit a un lado de Save pero en el template change_form.html no existe un bloque que por default pueda agregar elementos aun lado del {% submit_row %}. De hecho investigando encontre que es un Feature que se planea solucionar de alguna forma https://code.djangoproject.com/ticket/13875.

Existen algunas maneras de darle la vuelta sin modificar Django. La solución no es lo mas elegante.

En el change_form.html en /templates/admin/mymodel/

Código Django Template:
Ver original
  1. {% extends "admin/change_form.html" %}
  2. {% load i18n %}
  3.  
  4. {% block extrahead %}{{ block.super }}
  5.  
  6.  
  7. {% endblock extrahead %}
  8.  
  9. {% block after_field_sets %}{{ block.super }}
  10.  
  11. <input value="{% trans "Commit" %}"
  12.  class="move_to_submit_row" name="_commit" type="submit"/>
  13.  <script>
  14.      django.jQuery(document).ready(function() {
  15.          django.jQuery('.move_to_submit_row').insertBefore('.submit-row>input:first');
  16.      });
  17.  </script>
  18. {% endblock after_field_sets %}

Basicamente creo un botón igual y lo muevo con Jquery a donde debería de ir. Este botón tiene como atributo de nombre _commit y es tipo submit. Similar a _save y a los otros 2 botones.

Ahora en nuestro Admin.py sobre escribimos el método response_change para buscar que el request contenga dentro de Post un key "_commit" (el que definimos en el nombre del campo). Esto lo escribimos dentro de una clase de configuración del Administrador de Django. Ejemplo MyModelAdmin:

Código Python:
Ver original
  1. def response_change(self, request, obj):
  2.        
  3.         if request.POST.has_key("_commit"):
  4.             #  Aqui la magia
  5.             msg = (('The %(name)s "%(obj)s" has been Commited.') %
  6.                    {'name': str(obj._meta.verbose_name),
  7.                     'obj': str(obj)})
  8.             self.message_user(request, msg)
  9.             return HttpResponseRedirect("../%s/" % obj.pk)
  10.            
  11.            
  12.         return super(MyModelAdmin, self).response_change(request, obj)

Tambien agregué una forma con que sobre escribe clean que me permite validar y limpiar mis campos, pero eso puede ser opcional depende para que quieres el método.

El resultado :



Esto fue lo que yo hice ¿Qué sugieren ustedes?