En Django, ¿cómo sé el usuario que ha iniciado sesión actualmente?
Respuestas:
¿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
set_user
y 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_user
cuerpo dentro del bucle y funcionó perfectamente. Además, creo que if formset.model == Article
deberí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!
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.py
dentro 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.py
y 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)
get_username()
en el Models
objeto? 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?
El proyecto predeterminado de Django 1.9.6 tiene user
en 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.auth
procesador de contexto en settings.py
.
Pregunta de plantilla dedicada: ¿Cómo acceder al perfil de usuario en una plantilla de Django?