Hemos buscando por todo el mundo on line para así mostrarte la solución a tu inquietud, si tienes dificultades puedes dejar tu pregunta y responderemos con gusto, porque estamos para servirte.
Solución:
Puedes abordar este problema desde otro ángulo. En lugar de cambiar el método de guardado de modelos, debe anular AdminSites save_model
método. Allí tendrá el objeto de solicitud y podrá acceder a los datos de usuario registrados como ya señaló.
Eche un vistazo a este capítulo de los documentos: Documentación de Django ModelAdmin save_model
Sin embargo, encontré una manera de hacerlo, implica declarar un MiddleWare. Crea un archivo llamado get_username.py
dentro de tu aplicación, con este contenido:
from threading import current_thread
_requests =
def get_username():
t = current_thread()
if t not in _requests:
return None
return _requests[t]
class RequestMiddleware(object):
def process_request(self, request):
_requests[current_thread()] = request
Edita tu settings.py
y añádelo a la MIDDLEWARE_CLASSES
:
MIDDLEWARE_CLASSES = (
...
'yourapp.get_username.RequestMiddleware',
)
Ahora, en tu save()
método, puede obtener el nombre de usuario actual de esta manera:
from get_username import get_username
...
def save(self, *args, **kwargs):
req = get_username()
print "Your username is: %s" % (req.user)
La solución propuesta por @nKn es un buen punto de partida, pero cuando traté de implementarla hoy, enfrenté dos problemas:
- En la versión actual de Django, el middleware creado como objeto simple no funciona.
- Las pruebas unitarias están fallando (ya que generalmente se ejecutan en un solo hilo, por lo que su ‘solicitud’ se puede colocar entre dos pruebas consecutivas si la primera prueba tiene una solicitud HTTP y la segunda no).
Aquí está mi código de middleware actualizado, que funciona con Django 1.10 y no rompe las pruebas unitarias:
from threading import current_thread
from django.utils.deprecation import MiddlewareMixin
_requests =
def current_request():
return _requests.get(current_thread().ident, None)
class RequestMiddleware(MiddlewareMixin):
def process_request(self, request):
_requests[current_thread().ident] = request
def process_response(self, request, response):
# when response is ready, request should be flushed
_requests.pop(current_thread().ident, None)
return response
def process_exception(self, request, exception):
# if an exception has happened, request should be flushed too
_requests.pop(current_thread().ident, None)
Recuerda algo, que puedes optar por la opción de explicar si te fue preciso.