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 = {}
defget_username():
t = current_thread()
if t notin _requests:
returnNonereturn _requests[t]
classRequestMiddleware(object):defprocess_request(self, request):
_requests[current_thread()] = request
Edite su settings.pyy agréguelo a MIDDLEWARE_CLASSES:
@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.
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
fuente
set_user
y luego mapeándolainstances
. Simplemente no guardó nuevos modelos en la base de datos. Tuve que usar unfor instance in instances:
con elset_user
cuerpo dentro del bucle y funcionó perfectamente. Además, creo queif formset.model == Article
debería serif 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 aMIDDLEWARE_CLASSES
: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)
fuente
get_username()
en elModels
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 predeterminadasEntonces 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 ensettings.py
.Pregunta de plantilla dedicada: ¿Cómo acceder al perfil de usuario en una plantilla de Django?
fuente