초보 개발자

django edit-room with UpdateView 본문

Python/airbnb 클론

django edit-room with UpdateView

taehyeki 2022. 3. 16. 16:58

먼저 저번에 했던 것과 마찬가지로 

 

UpdateView를 상속한 View에서 아래를 정의해주어야 한다.

model
template_name
fields

그리고 update view는 똑똑해서 url에서 pk값을 받고 위의 model에 정의한 model에서 pk값에 해당하는 data를 반환하고 그 반환하는 데이터는 form에 담기는데 그 form에는 우리가 위에서 지정한 fields가 담겨져 있다.

 

그리고 그 form을 template_name에 정의해놓은 html파일에서 {{ form }}을 사용하여 접근할 수 있는 것이다.

 

전에 user의 profile을 edit하는 경우에 자신만! 바꿀 수 있어야했다.

내가 다른사람의 profile을 바꾸는건 있을 수 없기 때문이다. 저번에는 어떤 방식을 사용했냐면

Update View를 사용하되, pk값을 주지 않았다. pk값을 주지 않으면 당연히 오류가 발생한다. 모델의 pk값에 해당하는 데이터를 찾아 반환하기 못하기 때문이다.

 

그 반환해주는 함수는 get_object 메서드인데, 우리는 이걸 오버라이딩하여 현재 로그인 된 유저만 return하도록 해주어서 오류를 해결해주었다. return self.request.user <<<

 

이번에는 방을 edit해주어야 한다. 이 역시도 마찬가지로 내가 업로드한 방만 edit이 가능해야 한다.

따라서 이번에 또  get_object라는 메서드를 오버라이딩 하여 해결해보자!!

 

def get_object(self)

    room = super().get_object()

 

여기서 room을 print해보면 출력값으로 내가 현재 클릭한 방이 나온다. 그래서 나는 아래와 같이 해결해주었다.

class EditRoomView(UpdateView):
    def get_object(self, queryset=None):
        user = self.request.user
        obj = super().get_object(queryset)
        if obj in user.rooms.all():
            return obj
        else:
            raise Http404("권한 없습니다.")

근데 더 쉽게 생각해보면 user.pk 와 obj.host.pk와 비교해주는게 더 간단한 것 같긴하다. 어떤 방법을 써도 현재 단계에선 문제가 없어보인다??

 

그래서 get_object를 사용해서 어떠한 방이든 return을 시켜주는 것이 아닌 내가 업로드한 방만 return하도록 오버라이딩을 해주었다.

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

django photo delete, edit  (0) 2022.03.21
elastic beanstalk  (0) 2022.03.16
django class mixins  (0) 2022.03.15
django passwordchange with Form View  (0) 2022.03.15
django user-editprofile with UpdateView  (0) 2022.03.15