작정하고 Django (43) - Field Lookup을 사용한 구독 페이지 구현

김의찬·2023년 6월 28일

작정하고 Django !

목록 보기
44/45

Model_objects.filter(pk= xxx, user=xxx)
와 같이 filter를 사용했었다.

여기에서 pk와 user 값들을 넘겨주게 되는데, AND function이다.

2개의 조건을 동시에 만족해야하는 AND function이다.

OR function을 사용할때, WHERE function을 사용할때는 어떻게 해야할까 ?

구독앱을 만들기위해서 할 것
1. user 가 구독하고있는 project 찾기
2. projects 안에 있는 article 찾기

우리는 위의 filter 방식을

Articles.objects.filter(project__in=projects)
와 같이 바꿀 것이다.
여기서 언더바는 double underscore이다.

subscribe 에서의 views.py 작성



from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views.generic import RedirectView, ListView

from articleapp.models import Article
from projectapp.models import Project
from subscribeapp.models import Subscription


# Create your views here.

@method_decorator(login_required, 'get')
class SubscriptionView(RedirectView):


    def get_redirect_url(self, *args, **kwargs):
        return reverse('projectapp:detail', kwargs={'pk': self.request.GET.get('project_pk')})

    def get(self, request, *args, **kwargs):

        project = get_object_or_404(Project, pk=self.request.GET.get('project_pk'))
        user = self.request.user
        subscription = Subscription.objects.filter(user=user, project= project)

        if subscription.exists():
            subscription.delete()
        else:
            Subscription(user=user, project=project).save()
        return super(SubscriptionView,self).get(request, *args, **kwargs)

@method_decorator(login_required, 'get')
class SubscriptionListView(ListView):
    model = Article
    context_object_name = 'article_list'
    template_name = 'subscribeapp/list.html'
    paginate_by = 25

    def get_queryset(self):
        projects = Subscription.objects.filter(user=self.request.user).values_list('project')
        article_list = Article.objects.filter(project__in=projects)
        return article_list

메인에서 header.html 수정
<a href="{% url 'subscribeapp:list' %}"style="euichan_header_nav; color:black; text-decoration: none;"> <span>Subscription</span> </a>

Subscription으로 가는 버튼 추가.

profile
김의찬입니다

0개의 댓글