Django에서 현재 로그인 한 사용자를 어떻게 알 수 있습니까?


답변:


110

사용자를 어디에서 알아야합니까?

에서는 보기 사용자는 요청에 제공된다 request.user.

템플릿의 사용자 처리는 여기를 참조 하십시오.

모델 인스턴스 의 생성자 또는 편집자를 저장하려면 다음과 같이 할 수 있습니다.

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

인터넷에서 이걸 찾았지만 더 이상 어디 있는지 모르겠어요


4
참고로 save_formset-> set_user에서 hasattr (instance, 'created_by')
FurtiveFelon

settings.py에서 현재 사용자를 가져올 수 있습니까?
Mahendra Garg

왜 그렇게 하시겠습니까? (내 장고 일이 사라 졌어요, 새 질문을 만드십시오)
vikingosegundo

@vikingosegundo 왜 Django를 더 이상 사용하지 않는지 궁금합니다. 더 이상 백엔드 개발을하지 않습니까? 아니면 NodeJS로 옮겼습니까?
Alfa Bravo

1
어떤 이유로 그것은 나를 내부 기능을 사용하여 작동하지 않았다 set_user그것을 통해 매핑 다음과 instances. 새 모델을 데이터베이스에 저장하지 않았습니다. 나는 루프 내부의 몸체 for instance in instances: 와 함께 사용해야했고 set_user완벽하게 작동했습니다. 또한, 나는 생각 if formset.model == Article해야한다 if formset.model == Image. 귀하의 답변에 대해 @vikingosegundo에게 감사드립니다. 나는 이것을 해결하기 위해 며칠 동안 키보드에 머리를 두드리고 있었다 !!
ekauffmann

6

@vikingosegundo의 답변을 확장하여 모델 내부에서 사용자 이름을 얻으려면 MiddleWare 선언과 관련된 방법을 찾았습니다. 다음 get_username.py콘텐츠로 앱 내부에 라는 파일을 만듭니다 .

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

당신의 편집 settings.py하고 그것을 추가하십시오 MIDDLEWARE_CLASSES:

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

이제 save()메서드에서 다음과 같은 현재 사용자 이름을 얻을 수 있습니다.

from get_username import get_username

...

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


@nKn은 개체 에서 호출 get_username()하는 데 필요한 정말 전용 미들웨어 Models입니까? 그렇다면 이에 관한 표준 문서에 대한 링크가 있으면 좋을 것입니다. 1.9.5에서 동일한 작업을 수행하기 위해 업데이트 된 기본 django 함수가 있습니까?
alvas

5

Django 1.9.6 기본 프로젝트에는 user기본 템플릿이 있습니다.

따라서 다음과 같이 직접 작성할 수 있습니다.

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

이 기능은 django.contrib.auth.context_processors.auth컨텍스트 프로세서에 의해 제공됩니다.settings.py 합니다.

전용 템플릿 질문 : Django 템플릿에서 사용자 프로필에 액세스하는 방법은 무엇입니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.