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{% 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 originaldef 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?