현재 우리가 프로필 정보를 수정하고 나면
메인 화면으로 가게 되어있어요. 사실상 프로필 수정 입력화면 -> 프로필 화면으로 가는 것이 자연스럽습니다.
이를 수정할게요.
그런데 그냥 단순히 success_url = reverse_lazy('accountapp:detail')
부분에서 detail로 이름만 바꾸면 되겠지 생각하면 큰 오산!
왜냐! accountapp의 url페이지를 보면 url패턴에 pk가 있습니다. 이는 즉, 정적으로 넘어가게 되면 해당 페이지의 pk없이 가는 것이므로 문제가 되겠조?! 동적으로 페이지를 넘기는 것이 바로
get_success_url
메소드입니다.
ProfileCreateView, ProfileUpdateView
모두 pk 값이 필요하므로 해당 메소드를 구현할거에요.
reverse
메소드를 이용해서 url을 돌려야겠조. 그리고 2번째 인자에 pk 문자 키를 지정해서 self.object.user.pk
를 할당하는데요.
여기서 self.object가 Profile의 인스턴스를 의미해요. 그래서 편하게 생각하면 Profile(self.object)인스턴스의.user(속성 or field).pk 값을 말하는거에요.
profileapp/views.py
from django.urls import reverse_lazy, reverse
from django.utils.decorators import method_decorator
from django.views.generic import CreateView, UpdateView
from profileapp.decorator import profile_ownership_required
from profileapp.forms import ProfileCreationForm
from profileapp.models import Profile
class ProfileCreateView(CreateView):
model = Profile
context_object_name = 'target_profile'
form_class = ProfileCreationForm
success_url = reverse_lazy('accountapp:detail')
template_name = 'profileapp/create.html'
def form_valid(self, form):
temp_profile = form.save(commit=False)
temp_profile.user = self.request.user
temp_profile.save()
return super().form_valid(form)
def get_success_url(self):
return reverse('accountapp:detail', kwargs={'pk':self.object.user.pk}) # self.object가 가리키는 것은 바로 Profile 인스턴스를 말해요. 해당 유저의 pk겠조?
@method_decorator(profile_ownership_required, 'get')
@method_decorator(profile_ownership_required, 'post')
class ProfileUpdateView(UpdateView):
model = Profile
context_object_name = 'target_profile'
form_class = ProfileCreationForm
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'profileapp/update.html'
def get_success_url(self):
return reverse('accountapp:detail', kwargs={'pk': self.object.user.pk})
이러고 나서 다시 서버 돌려서 시도하면 정상적으로 확인 될거에요.