Jak w Django poznam aktualnie zalogowanego użytkownika?


Odpowiedzi:


110

Gdzie musisz znać użytkownika?

W widokach użytkownik jest podany w żądaniu jako request.user.

Na łatwość obsługi w szablonach zobaczyć tutaj

Jeśli chcesz zapisać twórcę lub edytora instancji modelu , możesz zrobić coś takiego:

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()

Znalazłem to w Internecie, ale już nie wiem gdzie


4
Uwaga, w save_formset -> set_user powinno być, jeśli nie hasattr (instancja, 'created_by')
FurtiveFelon

mogę pobrać aktualnego użytkownika w settings.py?
Mahendra Garg

Dlaczego chcesz to zrobić? (należy utworzyć nowe pytanie, moje dni django dawno już minęły)
vikingosegundo

@vikingosegundo Zastanawiałem się tylko, dlaczego nie używasz już Django? Czy nie zajmujesz się już programowaniem back-end, czy też przeniosłeś się na NodeJS?
Alfa Bravo

1
z jakiegoś powodu nie zadziałało to przy użyciu funkcji wewnętrznej, set_usera następnie jej odwzorowaniu instances. Po prostu nie zapisywał nowych modeli w bazie danych. Musiałem użyć for instance in instances: z set_userciałem wewnątrz pętli i działało idealnie. Dodatkowo myślę, że if formset.model == Articlepowinno if formset.model == Image. Dzięki @vikingosegundo za odpowiedź. Przez wiele dni uderzałem głową w klawiaturę, próbując rozwiązać ten problem!
ekauffmann

6

Rozszerzając odpowiedź @ vikingosegundo, jeśli chcesz uzyskać nazwę użytkownika w modelach, znalazłem sposób, który obejmuje zadeklarowanie oprogramowania MiddleWare. Utwórz plik o nazwie get_username.pywewnątrz aplikacji, zawierający następującą zawartość:

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

Edytuj swój settings.pyi dodaj go do MIDDLEWARE_CLASSES:

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

Teraz w swojej save()metodzie możesz pobrać aktualną nazwę użytkownika w następujący sposób:

from get_username import get_username

...

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


@nKn czy naprawdę dedykowane oprogramowanie MiddleWare jest niezbędne do wywołania get_username()w Modelsobiekcie? Jeśli tak, byłoby miło mieć link do kanonicznych dokumentów dotyczących tego. Czy są zaktualizowane natywne funkcje django w 1.9.5, które robią to samo?
alvas

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.