wake-up-neo.com

Woher kenne ich in Django den aktuell angemeldeten Benutzer?

Woher kenne ich in Django den aktuell angemeldeten Benutzer?

76
JasonYun

Wo müssen Sie den Benutzer kennen?

In views wird der Benutzer in der Anfrage als request.user.

Informationen zum Umgang mit Benutzern in Vorlagen finden Sie unter 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

107
vikingosegundo

Als ich @ vikingosegundos Antwort erweitere, wenn Sie den Benutzernamen in Models erhalten möchten, habe ich einen Weg gefunden, bei dem eine MiddleWare deklariert wird. Erstellen Sie in Ihrer App eine Datei mit dem Namen get_username.py 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 Ihren settings.py Und fügen Sie ihn dem MIDDLEWARE_CLASSES Hinzu:

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

Jetzt können Sie in Ihrer save() -Methode den aktuellen Benutzernamen wie folgt ermitteln:

from get_username import get_username

...

def save(self, *args, **kwargs):
    req = get_username()
    print "Your username is: %s" % (req.user)
6
nKn

Das Standardprojekt von Django 1.9.6 enthält user in den Standardvorlagen

So können Sie solche Dinge direkt schreiben:

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

Diese Funktionalität wird vom Kontextprozessor Django.contrib.auth.context_processors.auth In settings.py Bereitgestellt.

Spezielle Fragen zu Vorlagen: Wie greife ich in einer Django Vorlage? auf das Benutzerprofil zu?) ==