Django ViewClass 2-7) DetailView

Turtleยท2023๋…„ 12์›” 20์ผ
0
post-thumbnail

๐Ÿ“ŒDetailView

  • ๋ฐ์ดํ„ฐ ๋‹จ์ผ ๊ฑด ์กฐํšŒ๋ฅผ ์œ„ํ•œ ๋ทฐ ํด๋ž˜์Šค
  • ๋ทฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ self.object์—๋Š” ๋ทฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฐœ์ฒด๊ฐ€ ํฌํ•จ๋œ๋‹ค.
  • pk_url_kwarg ํ•„๋“œ์— Path Variable(Parameter) ๋ช…์„ ๋„ฃ์œผ๋ฉด ์•Œ์•„์„œ self.object์— ์กฐํšŒ๋  ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•ด์คŒ

Detail ๋ทฐ ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ

class DetailView:
	model: Model
    template_name: str
    pk_url_kwarg: str
    
    def get_context_data(self, **kwargs):
    	# self.object๋กœ DB ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ฐ€๋Šฅ
        return response: dict
from django.utils import timezone
from django.views.generic.detail import DetailView

from articles.models import Article


class ArticleDetailView(DetailView):
    model = Article

	# context์˜ now ๋ถ€๋ถ„์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•œ get_context_data
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["now"] = timezone.now()
        return context

๐Ÿ“Œ์ ์šฉ

from django.http import HttpRequest, HttpResponse
from django.shortcuts import render, HttpResponseRedirect, redirect
from django.views.generic import TemplateView, CreateView, UpdateView, DeleteView, ListView, DetailView, FormView
from .models import Task, ChecklistItem
from django.utils import timezone
from django.core.paginator import Paginator
from django.urls import reverse_lazy

class TaskDetailView(DetailView):
    model = Task
    template_name = "pages/task_detail.html"
    # primary key ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜๋ช… ์ง€์ •, path parameter
    pk_url_kwarg = 'task_id'
    
    # checklistitem์„ ๋ฐ›์•„์•ผํ•˜๋ฏ€๋กœ get_context_data๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ
    # ๊ธฐ์กด ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  context์— checklists๋ฅผ ํฌํ•จ์‹œํ‚ด
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # ํ•ด๋‹นํ•˜๋Š” task_id์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋งŒ์„ queryset์„ ์ด์šฉํ•ด์„œ ๊ฐ€์ ธ์˜ด
        context["checklists"] = ChecklistItem.objects.filter(task=self.object).all()
        return context
<div class="row justify-content-center">
    <div class="col-12">
        <h4 class="mt-2 p-2">
            <span class="badge badge-info">
                {{object.get_type_display}}
            </span>
            {{object.title}}
        </h4>
        <dl class="row mt-4 p-2">
            <dt class="col-sm-2">๋งˆ๊ฐ์ผ</dt>
            <dd class="col-sm-10">{{object.due|date:"Y๋…„ m์›” d์ผ H์‹œ i๋ถ„"}}</dd>
            <dt class="col-sm-2">์ƒ์„ฑ์ผ</dt>
            <dd class="col-sm-10">{{object.created_at|date:"Y๋…„ m์›” d์ผ H์‹œ i๋ถ„"}}</dd>
        </dl>
    </div>
</div>

๋ชจ๋ธ์˜ ์†์„ฑ๊ฐ’์„ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

์ฐธ๊ณ ์ž๋ฃŒ1 - Django extra instance methods

์ฐธ๊ณ ์ž๋ฃŒ2 - StackOverflow

0๊ฐœ์˜ ๋Œ“๊ธ€