Saltar al contenido

Django: obtenga el usuario actual en el guardado del modelo

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:

  1. En la versión actual de Django, el middleware creado como objeto simple no funciona.
  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *