728x90
반응형
RedirectView 기반의 구독 시스템 SubscribeApp 만들기
SubscribeApp 생성
python manage.py startapp subscribeapp
setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bootstrap4',
'accountapp',
'profileapp',
'articleapp',
'commentapp',
'projectapp',
'subscribeapp',
]
- 생성한 SubscribeApp 등록
urls.py
path('subscribe/', include('subscribeapp.urls')),
- 메인 app에서 SubscribeApp url 추가
subscribeApp/urls.py
from django.urls import path
from subscribeapp.views import SubscriptionView
app_name = 'subscribeapp'
urlpatterns = [
path('subscribe', SubscriptionView.as_view(), name='subscribe'),
]
- subscribeApp/urls.py 구독하기 url 추가
models.py
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
from projectapp.models import Project
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')
- 구독 Subscription 관련 model 생성( user, project)
- 이미 구독하고 있는 것 또 구독못하게 설정하기 위해 user와 project 한 쌍이 가지고 있는 Subscription은 오직하나만 설정
마이그레이션
- 생성한 Subscription model DB에 반영
subscribeApp/views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404
# Create your views here.
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
@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)
- 구독하기 RediectView로 클래스 생성
- 로그인 체크위해 login_required 데코레이터 추가
- project와 user정보 취합하기 위해 단축함수 get_object_or_404사용
html에서 project_pk를 전달 받고 없으면 404 에러뜸 - user가 우리가 찾은 user인지
project가 우리가 찾은 Project인지 구독정보 찾음 - 구독 정보가 있으면 구독정보 삭제하고 없으면 생성하여 DB저장
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)
else:
subscription = None
object_list = Article.objects.filter(project=self.get_object())
return super(ProjectDetailView, self).get_context_data(object_list=object_list,
subscription=subscription,
**kwargs)
- 게시판 detail 에서 user가 로그인 했는 지 확인 후 user에 대한 구독정보 확인 기능 추가
- 로그인 한 후 구독정보 subscription변수에 담아서 detail페이지로 return
projectapp/detail.html
<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-4" >
Subscribe
</a>
{% else %}
<a href="{% url 'subscribeapp:subscribe' %}?project_pk={{ target_project.pk }}"
class="btn btn-dark rounded-pill px-4" >
Unsubscribe
</a>
{% endif %}
{% endif %}
</div>
- 로그인 및 구독 안 한 경우 구독버튼(Subscribe) 보이고, 구독 한 경우 구독해지(UnSubscribe) 버튼 생성
- 로그인 하고 구독 안한 경우 게시물 detail페이지
- 구독 기능 활성화
- 구독한 경우 게시물 detail 페이지, 구독 해지버튼으로 변경되어짐
- 로그아웃 했을 경우, 구독버튼 비활성화
반응형
'Backend > Django' 카테고리의 다른 글
django 31. WYSIWYG 의 소개 및 적용 (0) | 2021.10.18 |
---|---|
django 30. Field Lookup을 사용한 구독 페이지 구현 (0) | 2021.10.18 |
django 28. MultipleObjectMixin을 통한 ProjectApp 마무리 (0) | 2021.10.13 |
django 27. 모바일 디버깅, 반응형 레이아웃 (0) | 2021.10.12 |
django 26. Commentapp 마무리 (0) | 2021.10.12 |