안녕하세요. django 내에서 로그인을 하면 어디서든 “user” 객체를 사용 할 수

 
JiSeung Jung

안녕하세요.
django 내에서 로그인을 하면 어디서든 “user” 객체를 사용 할 수 있던데요.
user객체처럼 어디서든 전역적으로 사용할 수 있도록 객체를 선언 해줄수있는 방법이 있을까요?
해당 방법을 찾는 이유가, django 기본 user모델을 foreignkey로 가지고있는 UserProfile모델을 하나 만들었습니다.
해당 모델을 html페이지마다 참조해 사용하려 하니 View에 선언된 함수마다 UserProfile을 가져오는 구문을 삽입하고 template쪽으로 인자를 넘겨주는 방법이 너무 무식한 방법같아 혹 방법이 있는지 질문 드립니다.

  • Chinseok Lee

    장고에서는 middleware 에서 request.user 에 값을 할당해주고 있습니다.
    https://github.com/django/django/blob/master/django/contrib/auth/middleware.py#L24
    custom middleware 를 만들어서 하실 수도 있겠습니다.

    혹은 템플릿에서만 쓴다면, custom context processors 를 만드시는 것도 한 방법입니다.

    남홍김

    User와 UserProfile 모델이 OneToOne으로 연결되어 있으면, {{ user.profile }} 이런 식으로 Template에서 사용할 수 있습니다. UserProfile이 FK로 연결되어 있다고 하셨는데, User가 여러 Profile을 가져야하는게 요구 조건인건가요? 그게 아니면 OneToOne으로 변경을 하시고 위처럼 사용하시는게 편하실 듯해요.

    JiSeung Jung

    UserProfile 안에 models.OneToOneField(user)되있는 상태입니다.custom context processors검색 해보겠습니다 답변 감사합니다

    남홍김

    정지승 그러면 템플릿에서 {{ user.profile }} 이렇게 하시면 됩니다.

    JiSeung Jung

    김남홍UserProfile내에 user = models.OneToOneField(user) 이런식으로 해놨는데 user모델에서 UserProfile모델을가져 올 수 있나요???

    Chinseok Lee

    class MyUser(models.Model):
    … pass

    class MyProfile(models.Model):
    … user = models.OneToOneField(MyUser)

    위와 같은 관계에서

    1:1 관계를 거는 쪽 (MyProfile) 에서는 user 필드를 통해 접근이 가능하구요.
    1:1 관계를 당하는 쪽 (MyUser) 에서는 거는 쪽 (MyProfile) 의 모델명 소문자 이름을 통해 접근이 가능합니다. ex) user.myprofile

    user.myprofile 접근 시에 myprofile 이 로딩이 되어있지 않으면, MyProfile.objects.get(user=self) 이 동작을 합니다. 해당 MyProfile 이 없으면 MyProfile.DoesNotExist 예외가 발생합니다.

    JiSeung Jung

    무작정 공부없이 개발에 돌입하다보니 이런 중요한 부분을 놓치고갔네요,답변감사합니다.

Advertisements