Django 2(18.DRFのlistviewを作成)feat.鼠疫キャンパス

4425 ワード

1.Listviewを作成!


01.製品の観点。pyでProductListAPIクラスを作成する

from django.shortcuts import render
from django.views.generic import ListView, DetailView
from django.views.generic.edit import FormView
from .models import Product
from .forms import RegisterForm
from order.forms import RegisterForm as OrderForm
from django.utils.decorators import method_decorator
from fcuser.decorator import admin_required
from rest_framework import generics
from rest_framework import mixins
from .serializers import ProductSerializer

# Create your views here.

# mixin은 하나의 컴포넌트로 만약에 이 클래스 view안에서 get메소드와 post메소드를 제공하는데
# get에서는 list형태의 api post에서는 생성에 대한 api를 만든다면
# 두 가지 기능 중에 get에 대한 mixin을 상속 받고
# 생성에 대한 mixin도 상속 받으면 바로 원하는 기능을 제공할 수 있다


class ProductListAPI(generics.GenericAPIView, mixins.ListModelMixin):
    # 데이터 검증을 위한 serializer 등록
    serializer_class = ProductSerializer

    # 어떠한 데이터를 갖고 올지 정할 quertyset 설정
    def get_queryset(self):
        # all(), 모든 데이터를 갖고 오겠다
        return Product.objects.all().order_by('id')

    # get함수 안에서 list(mixin)함수를 호출
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)
        # list라는 클래스의 함수를 호출하게 되면
        # 데이터베이스(모델)로 부터 어떤 리스트를 가지고 오고
        # 그걸 json형태로 변환해준다


class ProductList(ListView):
    model = Product
    template_name = 'product.html'
    # object_list로 사용하기 싫으면 context_object_name으로 변경 가능
    context_object_name = 'product_list'


@method_decorator(admin_required, name='dispatch')
class ProductCreate(FormView):
    template_name = 'register_product.html'
    form_class = RegisterForm
    success_url = '/product/'

    def form_valid(self, form):
        product = Product(
            name=form.data.get('name'),
            price=form.data.get('price'),
            description=form.data.get('description'),
            stock=form.data.get('stock')
        )
        product.save()
        return super().form_valid(form)


class ProductDetail(DetailView):
    template_name = 'product_detail.html'
    # 어떤 모델이 아닌 쿼리셋을 지정
    # 필터를 통해서 보여질지 말지도 결정할 수 있다
    queryset = Product.objects.all()
    # template에서 사용할 변수명 지정
    context_object_name = 'product'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Order의 forms의 생성자 함수!
        # 그리고 order의 views.py에서 request를 처리한다
        context['form'] = OrderForm(self.request)
        return context

02.ルートフォルダのurls。pyに登録

from django.contrib import admin
from django.urls import path
from fcuser.views import index, RegisterView, LoginiView, logout
from product.views import (
    ProductList, ProductCreate, ProductDetail,
    ProductListAPI
)
from order.views import OrderCreate, OrderList

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
    # class는 .as_view()를 입력!
    path('register/', RegisterView.as_view()),
    path('login/', LoginiView.as_view()),
    path('product/', ProductList.as_view()),
    path('product/create/', ProductCreate.as_view()),
    # 상세보기 페이지는 주소에 어떤 상품인지 나타낼수 있어야한다!
    # url에 지정을 할 수 있는데, detailView에서 기본적으로 pk라는 값을 사용
    # <int:pk> 숫자형으로 받고 받아온 숫자는 pk라는 변수로 사용
    path('product/<int:pk>/', ProductDetail.as_view()),
    path('order/create/', OrderCreate.as_view()),
    path('order/', OrderList.as_view()),
    path('logout/', logout),

    path('api/product/', ProductListAPI.as_view()),
]

03.api/product呼び出し(コンソール)



04.api/製品コール(ページ)