En Django, ¿cómo sé el usuario que ha iniciado sesión actualmente?

Respuestas:

109

¿Dónde necesitas conocer al usuario?

En las vistas, el usuario se proporciona en la solicitud como request.user.

Para el manejo de usuarios en plantillas, consulte aquí

Si desea guardar el creador o editor de la instancia de un modelo, puede hacer algo como:

model.py

class Article(models.Model):
    created_by = models.ForeignKey(User, related_name='created_by')
    created_on = models.DateTimeField(auto_now_add = True)
    edited_by  = models.ForeignKey(User, related_name='edited_by')
    edited_on  = models.DateTimeField(auto_now = True)
    published  = models.BooleanField(default=None)

admin.py

class ArticleAdmin(admin.ModelAdmin):
    fields= ('title','slug','text','category','published')
    inlines = [ImagesInline]
    def save_model(self, request, obj, form, change): 
        instance = form.save(commit=False)
        if not hasattr(instance,'created_by'):
            instance.created_by = request.user
        instance.edited_by = request.user
        instance.save()
        form.save_m2m()
        return instance

    def save_formset(self, request, form, formset, change): 

        def set_user(instance):
            if not instance.created_by:
                instance.created_by = request.user
            instance.edited_by = request.user
            instance.save()

        if formset.model == Article:
            instances = formset.save(commit=False)
            map(set_user, instances)
            formset.save_m2m()
            return instances
        else:
            return formset.save()

Encontré esto en Internet, pero ya no sé dónde

vikingosegundo
fuente
4
Solo una nota, en save_formset -> set_user, debería ser si no hasattr (instancia, 'created_by')
FurtiveFelon
¿Puedo obtener el usuario actual en settings.py?
Mahendra Garg
¿Por qué harías eso? (por favor cree una nueva pregunta, mis días de Django se acabaron hace mucho)
vikingosegundo
@vikingosegundo Me preguntaba por qué ya no usas Django. ¿Ya no hace desarrollo de back-end o ha pasado a NodeJS?
Alfa Bravo
1
por alguna razón, no funcionó para mí usando la función interna set_usery luego mapeándola instances. Simplemente no guardó nuevos modelos en la base de datos. Tuve que usar un for instance in instances: con el set_usercuerpo dentro del bucle y funcionó perfectamente. Además, creo que if formset.model == Articledebería ser if formset.model == Image. Gracias @vikingosegundo por tu respuesta. ¡Estuve golpeando mi cabeza con el teclado durante días tratando de resolver esto!
ekauffmann
6

Extendiendo la respuesta de @ vikingosegundo, si desea obtener el nombre de usuario dentro de Modelos, encontré una forma que implica declarar un MiddleWare. Cree un archivo llamado get_username.pydentro de su 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

Edite su settings.pyy agréguelo a MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (
    ...
    'yourapp.get_username.RequestMiddleware',
)

Ahora, en su save()método, puede obtener el nombre de usuario actual así:

from get_username import get_username

...

def save(self, *args, **kwargs):
    req = get_username()
    print "Your username is: %s" % (req.user)
nKn
fuente
Hilo dedicado: stackoverflow.com/questions/10991460/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@nKn es el middleware realmente dedicada necesario invocar get_username()en el Modelsobjeto? Si es así, sería bueno tener un enlace a documentos canónicos al respecto. ¿Hay funciones nativas de Django actualizadas en 1.9.5 para hacer lo mismo?
alvas
5

El proyecto predeterminado de Django 1.9.6 tiene useren las plantillas predeterminadas

Entonces puedes escribir cosas como esta directamente:

{% if user.is_authenticated %}
    {{ user.username }}
{% else %}
    Not logged in.
{% endif %}

Esta funcionalidad la proporciona el django.contrib.auth.context_processors.authprocesador de contexto en settings.py.

Pregunta de plantilla dedicada: ¿Cómo acceder al perfil de usuario en una plantilla de Django?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente