구독 역할을 하는 View
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
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)
urls.py 작성
from django.urls import path
from subscribeapp.views import SubscriptionView
app_name = 'subscribeapp'
urlpatterns = [
path('subscribe/', SubscriptionView.as_view(), name='subscribe')
]
models.py 작성
from django.contrib.auth.models import User
from django.db import models
from projectapp.models import Project
# Create your models here.
class Subscription(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='subscription')
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='subscription')
class Meta:
unique_together = ('user', 'project')
projectapp views.py 수정
def get_context_data(self, **kwargs):
project = self.object
user = self.request.user
if user.is_authenticated:
subscription = Subscription.objects.filter(user=user, project=project)
object_list = Article.objects.filter(project=self.get_object())
return super(ProjectDetailView,self).get_context_data(object_list=object_list,
subscription=subscription,
**kwargs)
projectapp 의 detail.html 수정
{% extends 'base.html' %}
{% load static %}
{% block content %}
<div>
<div style="text-align: center; max-width: 500px; margin: 4rem auto 1.5rem auto">
<img src="{{ target_project.image.url }}" alt=""
style="height: 12rem; width: 12rem; border-radius: 20rem; margin-bottom: 2rem; object-fit:cover;">
<h2 style="font-family : 'NanumSquareB' ">
{{ target_project.title }}
</h2>
<h5>
{{ target_project.description }}
</h5>
</div>
<div class = "text-center mb-5">
{% if user.is_authenticated %}
{% if not subscription %}
<a href="{% url 'subscribeapp:subscribe' %}?project_pk={{ target_project.pk }}"
class="btn btn-primary rounded-pill px-3">
Subscribe
</a>
{% else %}
<a href="{% url 'subscribeapp:subscribe' %}?project_pk={{ target_project.pk }}"
class="btn btn-dark rounded-pill px-3">
UnSubscribe
{% endif %}
{% endif %}
</div>
<div>
{% include 'snippets/list_fragment.html' with article_list=object_list %}
</div>
</div>
{% endblock %}