초보 개발자

django userProfile with DetailVeiw 본문

Python/airbnb 클론

django userProfile with DetailVeiw

taehyeki 2022. 3. 15. 11:32

DetailVeiw를 사용하여 userProfile을 만들어보려고한다.

 

uesrs/views.py

class UserProfileView(DetailView):
    model = users_models.User

users/urls.py

path("<int:pk>", users_views.UserProfileView.as_view(), name="profile"),

 

이렇게 설정해두고 users/123과 같이 접속을 하면 자동으로 user_detail.html이라는 템플릿을 찾게 된다.

 

user_detail.html파일을 만들고 거기에 {{user.first_name}}이라고 적으면 어떻게 될까??

나는 user라고 설정해두었으니 현재 접속해있는 나를 뜻할 것이고, 어떤 페이지를 가도(pk가 다른 아이디꺼여도)

내 이름이 나올 것이라고 생각을 하였다.

 

하지만 실제로는 다른 사람의 pk를 쳤을 때 다른 사람의 first_name이 나와버렸다.

심지어 다시 내 profile로 가도, 다른 사람의 first_name이 유지가 되어버렸다. 홈으로 돌아간 뒤에 다시 profile을 눌렀더니 내 이름이 보이긴 했다.

 

이렇게 user가 다른사람으로 변하는 이유는 Detailview가 user의 값을 바꿔버리기 때문이다.

다른 페이지에 있다면 user는 현재 로그인 한 나이지만 만약 profile 페이지로 간다면 거기서 user는 현재 url의 pk에 해당하는 유저로 바뀐다.

 

user/123으로 접속시 -> pk = 123이니까 -> detailview에서 user는 pk가 123인 아이디로 변경시켜버림 ( 현재 로그인 하고 있는 사람 상관 x )

 

따라서 이 문제점을 해결하기 위해선 DetailView를 오버라이딩을 해줘야한다. DetailVeiw에서는 context_object_name이라는 프로퍼티가 있다. 

 

이 코드는 위에서 말한대로 뷰에서 찾은 유저객체를 가르키는 방법을 바꿀 수 있도록 해준다.  기존에는 user로 설정이 되어있었나본데 현재 접속해있는 user와 별개로 이를 user_obj라고 적어주면 현재 detailView가 찾은 id는 user_obj로 표시할 수 있게 되는 것이다!!!!

 

쉽게말해서 DetailView에 별도의 context_object_name을 설정해주지 않으면 user를 현재 로그인 되어있는 유저가 아닌 DetailView에서 반환한 user로 바꿔버린다. 따라서 context_object_name를 설정해주어 현재 로그인 되어있는 user와 관계없이 내가 찾고자 하는 user에 접근할 수 있도록 해주자.

views.UserProfileView
templates/users/user_detail.html

앞이 user(현재 로그인) 뒤가 user_obj(user/100 detailview가 반환한 pk=100에 해당하는 user)

 

'Python > airbnb 클론' 카테고리의 다른 글

django passwordchange with Form View  (0) 2022.03.15
django user-editprofile with UpdateView  (0) 2022.03.15
django message  (0) 2022.03.14
django login, signup page  (0) 2022.03.13
django password_validator  (0) 2022.02.21