Django ViewClass 2-11) Mixin

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

๐Ÿ“ŒMixin

  • ํŒŒ์ด์ฌ์˜ ๋‹ค์ค‘ ์ƒ์† ๋ฌธ๋ฒ•์„ ์ด์šฉํ•œ ๋ฏน์Šค์ธ ํŒจํ„ด์„ ์ด์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๋ทฐ ํด๋ž˜์Šค๋“ค์˜ ํŠน์ง•์„ ์กฐํ•ฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

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

class SampleViewClass(MixinClass, ViewClass):
...

๊ฐ Mixin ์ „์šฉ ํด๋ž˜์Šค๋“ค

  • TemplateResponseMixin โ†’ TemplateView
  • SingleObjectMixin โ†’ DetailView
  • MultipleObjectMixin โ†’ ListView
  • FormMixin โ†’ FormView
  • ModelFormMixin โ†’ CreateView, UpdateView

์ฐธ๊ณ  ์ž๋ฃŒ - Django Using mixins with class-based views


๐Ÿ“ŒMixin์„ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ์˜ ์ฐจ์ด์ (์ ์šฉ)

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)
        context["checklists"] = ChecklistItem.objects.filter(task=self.object).all()
        return context
from django.db.models.query import QuerySet
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

# Mixin์„ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰
from django.views.generic.detail import SingleObjectMixin

class TaskDetailView(SingleObjectMixin, ListView):
    template_name = "pages/task_detail.html"
    # primary key ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜๋ช… ์ง€์ •, path parameter
    pk_url_kwarg = 'task_id'
    paginate_by = 5
    
    def get(self, request, *args, **kwargs):
        self.object = self.get_object(queryset=Task.objects.all())
        return super().get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['task_id'] = self.object
        return context

    def get_queryset(self):
        return ChecklistItem.objects.filter(task=self.object).all()

๐Ÿ“ŒUsing SingleObjectMixin with ListView

  • ListView๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์™ธ๋ž˜ ํ‚ค๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด ๋ชฉ๋ก์˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์›ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์ถœํŒ ์˜ˆ์‹œ์—์„œ๋Š” ํŠน์ • ์ถœํŒ์‚ฌ์˜ ๋ชจ๋“  ์ฑ…์— ๋Œ€ํ•ด ํŽ˜์ด์ง€๋ฅผ ๋งค๊ธธ ์ˆ˜ ์žˆ๋‹ค.
from django.views.generic import ListView
from django.views.generic.detail import SingleObjectMixin
from books.models import Publisher


class PublisherDetailView(SingleObjectMixin, ListView):
    paginate_by = 2
    template_name = "books/publisher_detail.html"

    def get(self, request, *args, **kwargs):
        self.object = self.get_object(queryset=Publisher.objects.all())
        return super().get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["publisher"] = self.object
        return context

    def get_queryset(self):
        return self.object.book_set.all()
  • ListView์—์„œ ์‚ฌ์šฉํ•  ์ฑ… QuerySet์€ ์šฐ๋ฆฌ๊ฐ€ ํ‘œ์‹œํ•˜๋ ค๋Š” ์ฑ…์˜ ์ถœํŒ์‚ฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ get_queryset()์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ณ  ์ถœํŒ์‚ฌ์˜ ์—ญ ์™ธ๋ž˜ํ‚ค ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ ๊ฒŒ์‹œ์ž ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด get_object()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํŽ˜์ด์ง€๋„ค์ด์…˜(Pagination)ํŒŒํŠธ์—์„œ๋„ ๊ณต๋ถ€ํ–ˆ์ง€๋งŒ paginator๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์ฒญ๋œ ํŽ˜์ด์ง€(page)์— ํ•ด๋‹น๋˜๋Š” ํŽ˜์ด์ง• ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ page_obj์ด๋‹ค. ํŽ˜์ด์ง• ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
ํ•ญ๋ชฉ์„ค๋ช…
paginator.count์ „์ฒด ๊ฒŒ์‹œ๋ฌผ ๊ฐœ์ˆ˜
paginator.per_pageํŽ˜์ด์ง€๋‹น ๋ณด์—ฌ์ค„ ๊ฒŒ์‹œ๋ฌผ ๊ฐœ์ˆ˜
paginator.page_rangeํŽ˜์ด์ง€ ๋ฒ”์œ„
numberํ˜„์žฌ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
previous_page_number์ด์ „ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
next_page_number๋‹ค์Œ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
has_previous์ด์ „ ํŽ˜์ด์ง€ ์œ ๋ฌด
has_next๋‹ค์Œ ํŽ˜์ด์ง€ ์œ ๋ฌด
start_indexํ˜„์žฌ ํŽ˜์ด์ง€ ์‹œ์ž‘ ์ธ๋ฑ์Šค(1๋ถ€ํ„ฐ ์‹œ์ž‘)
end_indexํ˜„์žฌ ํŽ˜์ด์ง€ ๋ ์ธ๋ฑ์Šค(1๋ถ€ํ„ฐ ์‹œ์ž‘)

๐Ÿ“ŒDjango ์›น ๊ฐœ๋ฐœ์˜ ํ๋ฆ„

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