작정하고 Django (42) - RedirectView를 통한 Subscribeapp 시작

김의찬·2023년 6월 28일

작정하고 Django !

목록 보기
43/45

RedirectView

구독 역할을 하는 View

  1. subscribeapp 생성

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 %}
profile
김의찬입니다

0개의 댓글