[django] get_success_url

Hyeseong·2020년 12월 17일
0

django

목록 보기
12/35

get_success_url & refactoring


현재 우리가 프로필 정보를 수정하고 나면

메인 화면으로 가게 되어있어요. 사실상 프로필 수정 입력화면 -> 프로필 화면으로 가는 것이 자연스럽습니다.

이를 수정할게요.

그런데 그냥 단순히 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})

이러고 나서 다시 서버 돌려서 시도하면 정상적으로 확인 될거에요.

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글