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
{% extends "admin/change_form.html" %} {% load i18n %} {% block extrahead %}{{ block.super }} {% endblock extrahead %} {% block after_field_sets %}{{ block.super }} <input value="{% trans "Commit" %}" class="move_to_submit_row" name="_commit" type="submit"/> <script> django.jQuery(document).ready(function() { django.jQuery('.move_to_submit_row').insertBefore('.submit-row>input:first'); }); </script> {% 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
def response_change(self, request, obj): if request.POST.has_key("_commit"): # Aqui la magia msg = (('The %(name)s "%(obj)s" has been Commited.') % {'name': str(obj._meta.verbose_name), 'obj': str(obj)}) self.message_user(request, msg) return HttpResponseRedirect("../%s/" % obj.pk) 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?