Woher kenne ich in Django den aktuell angemeldeten Benutzer?
Antworten:
Wo müssen Sie den Benutzer kennen?
In Ansichten wird der Benutzer in der Anfrage als angegeben request.user.
Informationen zur Benutzerhandhabung in Vorlagen finden Sie hier
Wenn Sie den Ersteller oder Editor einer Modellinstanz speichern möchten, können Sie Folgendes tun:
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()
Ich habe das im Internet gefunden, weiß aber nicht mehr wo
set_userund sie dann abzubilden instances. Es wurden einfach keine neuen Modelle in der Datenbank gespeichert. Ich musste ein for instance in instances: mit dem set_userKörper in der Schleife verwenden und arbeitete perfekt. Darüber hinaus denke ich, dass das if formset.model == Articlesein sollte if formset.model == Image. Vielen Dank an @vikingosegundo für Ihre Antwort. Ich habe tagelang mit dem Kopf auf die Tastatur geschlagen, um das zu lösen !!
Wenn Sie die Antwort von @ vikingosegundo erweitern und den Benutzernamen in Models erhalten möchten, habe ich einen Weg gefunden, bei dem eine MiddleWare deklariert wird. Erstellen Sie eine get_username.pyin Ihrer App aufgerufene Datei mit folgendem Inhalt:
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
Bearbeiten Sie Ihre settings.pyund fügen Sie es hinzu MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = (
...
'yourapp.get_username.RequestMiddleware',
)
Jetzt können Sie in Ihrer save()Methode den aktuellen Benutzernamen wie folgt abrufen:
from get_username import get_username
...
def save(self, *args, **kwargs):
req = get_username()
print "Your username is: %s" % (req.user)
get_username()im ModelsObjekt aufzurufen ? Wenn ja, wäre es schön, einen Link zu einem kanonischen Dokument zu haben. Gibt es aktualisierte native Django-Funktionen in 1.9.5, um dasselbe zu tun?
Das Standardprojekt von Django 1.9.6 ist userin den Standardvorlagen enthalten
So können Sie solche Dinge direkt schreiben:
{% if user.is_authenticated %}
{{ user.username }}
{% else %}
Not logged in.
{% endif %}
Diese Funktionalität wird vom django.contrib.auth.context_processors.authKontextprozessor in bereitgestellt settings.py.
Spezielle Vorlagenfrage: Wie greife ich auf das Benutzerprofil in einer Django-Vorlage zu?