작성
·
239
1
안녕하세요 강사님
좋은 강의 열심히 듣고 있습니다.
profile_edit 부분을 CBV로 구현해봤는데
이런 형식으로 만드는게 맞는지 궁금합니다..
기능은 정상적으로 작동하는데 코드가 너무
복잡해보여서 제대로 만든건지 의구심이 듭니다..
@method_decorator(login_required, name='dispatch')
class ProfileUpdateView(UpdateView):
model = Profile
template_name = 'accounts/profile_form.html'
form_class = ProfileForm
pk_url_kwarg = "id"
success_url = settings.LOGIN_REDIRECT_URL
profile_edit
답변 1
1
안녕하세요.
제가 추가로 만들고 있는 강의에서 예시로 사용하는 코드는 아래와 같습니다.
프로필 수정이 로그인 유저 본인의 프로필만 수정한다면 굳이 url에 pk를 노출할 것없이 get_object를 통해서 바로 모델 인스턴스를 지정하는 방법이 나을 수 있습니다. 로그인 시에는 항상 request.user가 현재 User 인스턴스이니깐요. // 아래의 예시에서의 ProfileForm은 User 모델에 대한 ModelForm이라서 request.user 를 반환한 것이구요. 별도로 Profile 모델을 구성하셨다면 Profile 모델 인스턴스를 반환하면 됩니다.
CBV는 지원되는 클래스 변수를 통해 커스텀이 가능하죠. 구현에 필요하신 만큼 지정하시면 되구요. 디폴트 설정을 최대한 활용하신다면 설정을 조금 줄이실 수는 있습니다. pk_url_kwarg도 디폴트 "pk"로 가져가는 정도이고. 나머지 설정들은 필요하실 수도 있겠네요.
CBV 구현은 FBV 구현에 비해서 코드 양이 조금 늘수는 있지만, View에서의 중복을 줄여 생산성 및 가독성을 높일 수 있는 아주 좋은 기능입니다. 그리고 View 구현을 보다 체계적으로 가져갈 수 있구요. 그렇다고 해서 모든 View를 CBV로 구현하실 필요는 없구요. 뷰에 따라 FBV 구현이 보다 간결하고 효과적일 수도 있습니다.
화이팅입니다. :-)
장고에서 ModelForm을 활용한 뷰 처리에서는 생성과 수정의 로직은 거의 똑같습니다. 단 하나의 차이는 ModelForm 인스턴스를 생성할 때 instance 키워드 인자로 None을 지정하느냐, 혹은 수정할 모델 인스턴스를 지정하느냐의 차이이죠.
ModelForm 인스턴스 생성시에 지정하는 instance 인자는
CreateView와 UpdateView에서는 get_object 멤버함수를 통해 반환됩니다. 보통은 get_object를 재정의할 필요는 없습니다. CreateView에서는 알아서 None이 지정될 테고, UpdateView에서는 url의 pk 인자를 통해 관련 모델 인스턴스를 찾아서 알아서 지정해줍니다.
이에 대한 장고 내부 코드는 장고 소스코드를 보는 것이 가장 정확하겠죠.
https://github.com/django/django/blob/main/django/views/generic/edit.py#L171
위 코드를 보시면 CreateView는 BaseCreateView를 상속을 받았고 UpdateView는 BaseUpdateView를 상속받았습니다. BaseCreateView와 BaseUpdateView의 부모는 ModelFormMixin과 ProcessFormView로 동일합니다. 차이는 내부 구현에 있는 데요. BaseCreateView의 get/post 구현은 self.object = None이고, BaseUpdateView의 get/post 구현은 self.object = self.get_object() 입니다.
그러니 get_object를 아래와 같이 구현해보실 수 있겠습니다.
화이팅입니다. :-)
답변 감사드립니다.
프로필을 fbv를 이용해서 프로필 업데이트 기능을 구현 할때
프로필이 생성되지 않은 상황은
profile=None으로 처리하였는데
이 부분을 CBV로 구현할 때
어떻게 해야할지 감이 잡히지가 않습니다.
강의 해주신내용에서
fbv 는 cbv로 cbv는 fbv로 구현하면서
연습해보고 있는데 어렵네요.. ㅎㅎ...