일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- git
- async
- node
- lambda
- EC2
- MongoDB
- flask
- merge
- 중급파이썬
- pandas
- wetube
- Vue
- Class
- docker
- TypeScript
- 카톡
- RDS
- 파이썬
- 튜플
- crud
- Props
- dict
- S3
- NeXT
- react
- SSA
- AWS
- socket io
- 채팅
- SAA
- Today
- Total
초보 개발자
django userProfile with DetailVeiw 본문
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에 접근할 수 있도록 해주자.
앞이 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 |