Woher kenne ich in Django den aktuell angemeldeten Benutzer?


Antworten:


109

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


4
Nur eine Anmerkung, in save_formset -> set_user sollte es sein, wenn nicht hasattr (Instanz 'created_by')
FurtiveFelon

Kann ich den aktuellen Benutzer in settings.py abrufen?
Mahendra Garg

Warum würdest du das tun? (Bitte erstellen Sie eine neue Frage, meine Django-Tage sind lange vorbei)
vikingosegundo

@vikingosegundo Ich habe mich nur gefragt, warum Sie Django nicht mehr verwenden. Führen Sie keine Back-End-Entwicklung mehr durch oder sind Sie zu NodeJS gewechselt?
Alfa Bravo

1
Aus irgendeinem Grund hat es bei mir nicht funktioniert, die innere Funktion zu verwenden 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 !!
Ekauffmann

6

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)


@nKn ist die wirklich dedizierte MiddleWare notwendig, um 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?
Alvas

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.