Server/Django project 1 - shopping mall

10. Django product app 상품 상세보기

개발자킹콩 2020. 9. 29. 18:53

상품 상세보기 또한 기본적으로 제공하는 View 중에서

DetailView를 사용해서 구현해 볼 것이다!!

( 지금까지 배운것 2가지 : FormView, ListView )

from django.views.generic import ListView, DetailView

from django.views.generic.edit import FormView

똑같이 template_name 지정하고, 적절한 형식만 맞추면 된다. 가보자잉!!!!

 

1. views.py

2. product_detail.html

3. urls.py

4. primary key

5. bootstrap

6. 링크 연결

 

 

 


 

 

1. views.py

 

views.py

 

여기서 달라지는 것은 queryset 이라는 변수에 특정 값을 넣어줘야 한다.!!!!!!!!!!!!!!!!!!

특정 값은 원하는 DB의 데이터들을 의미하며,

지금은 DB에 존재하는 모든 product의 detail을 설정할 것이므로

queryset = Product.objects.all()

다음과 같이 기재해주면 된다.

 

어떤 조건을 주고 싶다면 다음과 같이 설정해주면 price가 1000원인 물건을 다 가져온다.

Product.objects.filter(price=1000)

 

다음과 같이 DB로 가져오는 함수의 경우 원하는 데이터만 들고 올 수도 있고,

그 데이터의 나열 방식 또한 원하는 대로 조건을 줄 수 있다.

 

그리고 templates에서 사용할 변수 명 또한 해당 view에서 지정해줄 수 있다.

 

 

 

 


 

 

 

2. product_detail.html

이제 product_detail.html 을 (product.html 복붙해서) 만들고,  

콤마와 더불어서 데이터를 나타내는 기능을 계속 쓸 것 이므로

{% load humanize %} 는 유지하도록 한다.

 

이제 table tag를 제거하고 div 태그를 이용해서 데이터의 상세보기를 구현해보자

 

product_detail.html

 

다음의 데이터가 어떻게 나오는지 궁금하니까

url로 연결하여 제품 상세가 어떻게 출력되는지 살펴보자

 

product.description은 상품설명에 해당하는 변수이다.

 

 

 


 

 

 

3. urls.py

 

여기서 중요한 정보가 하나 또 뜨는데

detail의 경우 어떤 페이지를 detail하게 보여주는가를 url로 지정해줄수 있다

예를들어

product/detail/1  --> 1번 상품 디테일

product/detail/2  --> 2번 상품 디테일

product/detail/3  --> 3번 상품 디테일

 

 

이런식으로 만들 것인데 모든 상품에 대한 url을 만들것은 아니다.

우리는 반복을 굉장히 싫어하는 개발자라는 인간들이기 때문에

 

shopping_django/urls.py

 

 

 

 

 

기본적으로 detail에서 사용하는 값은 pk값이다.

pk는 무엇일까?? 답부터 말하면 primary key이다.

 

 

 

 

 

 


 

[ 여기서는 다른파일을 참고하여 추가설명을 하려한다. ]

 

추가설명을 위한 어느 urls.py

 

추가설명을 위한 어느 views.py

 

다음과 같이 path를 지정하게 되면  -->  "detail/<int:pk>/"

해당 url의 끝에는 int형인 숫자들이 들어오게 되고,

views.board_detail 함수를 호출할 때, 해당 숫자는 지정해준 변수로 같이 전달된다.

 

urls.py 에서 pk로 지정해주었고, 해당 함수에서 pk의 값으로 적절하게 해당 페이지를 보여줄 지에 대한

예외처리를 하는 코드를 구현한 것이다.

 

[추가설명 끝]

 

 

 

 

 


 

 

 

 

자! 다시 본론으로 돌아와서,

 

원래의 urls.py 파일의 코드와 같이 path를 지정하게 되면  -->  "detail/<int:pk>/"

해당 url의 끝에는 int형인 숫자들이 들어오게 되고,

이때 ProductDetail이라는 View에서 이 숫자를 pk로 받아들여서 사용할 수 있게 된다.

즉, 그 pk를 통해서 적절하게 해당 페이지를 띄울수 있는 것이다.

 

views.py

 

해당 DetailView는 추가설명 부분이 구현이 되어있기에 비교적 간단하게 코드 작성이 가능하다.

 

 

 

 

 


 

 

 

 

4. pk == primary key

 

그런데 pk에 대해 추가 설명을 하자면, pk는 primary key를 의미한다.

urls.py의 링크처럼 "product/<int:pk>/" 로 지정한다면

해당 DetailView는 pk에 맞는 적절한 값을 찾아서 보여주게 될 것이다.

 

우리는 데이터를 정의하기 위해서 models.py를 작성하고,

terminal 창에 두 개의 command lines을 실행시켰다.

$ python manage.py makemigrations

$ python manage.py migrate

 

두 개의 command lines은 적절하게 DB의 구조를 만들었고,

해당 product/migrations의 파일을 확인해보면 다음과 같은 Query 문을 볼 수 있다.

 

product의 경우 primary key는 ID에 해당하고, 이는 list에서 처음 값에 해당하는 것이다.

그것을 url로 지정하면 원하는 데이터의 상세보기를 할 수 잇다.

 

 

 

 

 

 

 

 


 

 

 

 

 

5. bootstrap

 

우선 지금까지의 과정이 잘 연결되었는지 아래 두 개의 사진을 통해 확인하였다.

 

list

 

 

detail

 

 

 

 

description의 경우 tag로 값이 들어 잇기때문에 그냥 출력하면 안된다.

이제 이 정보들을 bootstrap를 이용해서 이쁘장하게 치장해보자!!!!!!!!

bootstrap의 card를 이용해서 테두리만 나오게 하고,깔끔하게만 보이게 디자인을 입혀보자

 

일단 card로 만들고 우리는 임의의 컨데이너에서 가로 길이를 잡아놨기 때문에

카드는 전체길이 확장해서 100%로 지정한다 .

 

그리고 card-body를 만들어서 상품명을 card-title로 지정한다.

그후 list로 아래의 속성값들을 보여주도록 하자.

 

요약하면, bootstrap에는 정해진 css파일에 적절한 치장이 되도록 class가 지정되어 있는데,

태그의 class 이름만 지정해주면 적절하게 사용할 수 있는 것이다.

 

 

 

 

 

product_detail.html

 

 

 

 

 

 

 

 

이미지 한번넣었는데 text 겁나 길게 나오네...

근데 이 태그를 text로 출력하는게 아니라

tag로써 사용하고 싶으면 적절한 필터를 사용하면 된다.

safe 필터를 사용하게 되면 정상적으로 이미지가 출력된다.

 

product_detail.html

 

 

 

 

 

 


 

 

6. 링크 연결

 

 

이제 detail페이지가 만들어 졌으니 적절하게 링크이동을 하도록 만들어 보자

list에서 상품을 클릭했을때 detail이 나올수 있도록!!

 

product.html

 

 

 

정상적으로 연결되었으며

detail에서 뒤로가기 버튼을 만들어 보자

 

product_detail.html

 

 

 

 

 

 

이상!! 오늘도 감코!!