웹 프로그래밍

[django] 다음글 or 이전글로 넘어가기 구현

728x90
반응형

팀찾기나 팀원찾기, 대회및 공모전의 detail 페이지 내에서 빠져나가지 않고 <다음글> 버튼을 눌러 다음 카드로 넘어갈 수 있게 하고 싶었다. 현재 URI는 /teams/<pk>/ 나 member/detail/<slug> 이런식으로 만들어져 있다.

처음엔 단순히 pk+1, pk-1이런식으로 페이지를 넘길수 있게하면 되겠다 생각해서 쉽게 생각했는데 삭제된 글이 있다면 중간에 pk가 연속적이지 않을 수도 있고 팀원찾기의 경우엔 slug로 만들어놔서 그 문제도 있었다. 


어떻게 할것인가?

 

글의 목록을 리스트로 받아오고,  현재 위치한 글의 인덱스를 찾은 다음 pk가 아닌 인덱스 번호를 움직여 페이지를 리다이렉트시킬 수 있게하면 될 것 같다. custom_tags.py 나 views.py에서 구현하면 될 듯. 시간될 때 구현하고 이어서 작성해두겠다.  

 


class TeamDetailView(DetailView):
    model = Team
    context_object_name = 'target_team'
    template_name = 'teamapp/page/detail.html'

    def get_context_data(self, **kwargs):
        team = self.object
        user = self.request.user
        try:
            the_prev = Team.objects.filter(pk__lt=team.pk).order_by('-pk').first().pk
        except:
            the_prev = Team.objects.filter(pk__gt=team.pk).order_by('-pk').first().pk
        try:
            the_next = Team.objects.filter(pk__gt=team.pk).order_by('pk').first().pk
        except:
            the_next = Team.objects.filter(pk__lt=team.pk).order_by('pk').first().pk

        subscription = None
        if user.is_authenticated:
            subscription = TeamSubscription.objects.filter(user=user, team=team)
        return super(TeamDetailView, self).get_context_data(the_prev=the_prev, the_next=the_next, subscription = subscription, **kwargs)

 

이전 오브젝트와 이후 오브젝트의 pk를 구해 context로 보냈고 템플릿에서 이 pk를 이용해 페이지를 리다이렉트시켰다

다음 페이지나 이전 페이지가 없을 경우엔 에러가 발생하는데 이를 해결하기위해 try except구문으로 예외경우에 리스트를 뒤집어주었다

728x90
반응형