meong_j
기록하는 습관.
meong_j
전체 방문자
오늘
어제
  • 분류 전체보기 (176)
    • 개인 공부 정리 (0)
    • 서버 운영 (37)
      • Linux (36)
    • Frontend (11)
      • Vue.js (10)
    • Backend (70)
      • Java (4)
      • Python (22)
      • Django (38)
      • Spring (6)
    • Database (5)
      • Oracle (4)
      • MySQL (1)
      • MariaDB (0)
    • Android (14)
      • Kotlin (6)
    • 배포 (9)
      • Docker (8)
      • AWS (1)
    • IT_study (29)
      • Coding test (17)
      • 알고리즘 (5)
      • 스터디 (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

인기 글

반응형

태그

  • 코틀린자료형
  • SASS Variables
  • 개발자도서
  • django
  • gabagecollecter
  • DHCP
  • 중첩라우트
  • dp #알고리즘
  • 이차원배열정렬
  • cpu사용률
  • 안드로이드adaptor
  • docker
  • Kotlin
  • 리눅스인증
  • 배포인프라
  • Proxy
  • router-link
  • dockersecret
  • 리눅스방화벽
  • 테크커리어

최근 댓글

최근 글

250x250
hELLO · Designed By 정상우.
meong_j

기록하는 습관.

django 29.  RedirectView을 통한 SubscribeApp시작
Backend/Django

django 29. RedirectView을 통한 SubscribeApp시작

2021. 10. 13. 18:27
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
    'Backend/Django' 카테고리의 다른 글
    • django 31. WYSIWYG 의 소개 및 적용
    • django 30. Field Lookup을 사용한 구독 페이지 구현
    • django 28. MultipleObjectMixin을 통한 ProjectApp 마무리
    • django 27. 모바일 디버깅, 반응형 레이아웃
    meong_j
    meong_j
    #it #개발일기 #개발공부 #개발자 #백앤드 #생각정리 #시간은 실력에 비례한다 #뭐든지 꾸준히 열심히 #오늘의 내가 내일의 나를 만든다

    티스토리툴바