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으로 가는 버튼 추가.