블로그를 따라 만드는 중에 카테고리 페이지를 구현하는데서 막혔다.
이를 공부하다보니 카테고리 리스트 구현이 궁금해 뒤돌아가서 익히고,
카테고리 테이블이 별도로 없는 걸 다시 알고 모델도 또 공부했다.
공부하고 잊히고 다시 알게 되는 중이다. 알고보니 내가 대충 공부했던 것이다.
역으로 공부했으니 복습은 정방향으로 기록하겠다.
1. 카테고리는 게시글 테이블에 선택 가능한 필드 형태로 넣는다.
Article |
|||
id | title |
content | category |
1 | 안녕 | 놀러와 | development / personal 중에 선택 |
블로그에서 게시글 테이블은 제목, 내용, 카테고리만 입력하도록 만들었다.
단, 카테고리는 둘 중 하나 선택하도록 추가적인 설정을 해주었다.
choice 필드에 대한 자료(https://docs.djangoproject.com/en/2.1/ref/models/fields/)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Article(models.Model): DEVELOPMENT = "dv" PERSONAL = "ps" CATEGORY_CHOICES = ( (DEVELOPMENT, "development"), (PERSONAL, "personal"), ) title = models.CharField(max_length=200) content = models.TextField() category = models.CharField( max_length=2, choices=CATEGORY_CHOICES, default=DEVELOPMENT ) | cs |
2. View에서 카테고리 리스트를 만든다.
article_list는 ORM으로 모든 게시글 데이터가 담긴 변수이다.
(ORM(Object-Relational Mapping)은 애플리케이션과 데이터베이스 간의 데이터 처리를 추상화하여 다룰 수 있는 편리한 방법)
카테고리는 메소드를 통해 풀네임을 변수에 담았다.
1 2 3 4 | category_list = set([ article.get_category_display() for article in article_list ]) | cs |
3. Templete에서 카테고리 리스트 매핑하기
1 2 3 | {% for category in category_list %} <li>{{ category }}</li> {% endfor %} | cs |
아직 링크가 걸려있지 않아서 카테고리로서의 기능은 없다.
4. View에서 해당 카테고리만의 게시글 리스트 만들기
GET 방식은 웹브라우저에서 주소창에 입력하여 서버에 데이터를 요청하는 것이다.
네이버에서 무언가를 검색하면 주소창에 /?query=무언가 형태로 작성된 것이 보이는데,
쿼리스트링의 형태로 서버에 데이터를 요청하여 검색페이지가 출력되는 것이다.
이를 카테고리에 비슷하게 적용할 수 있다.
1 | category = request.GET.get("category") | cs |
주소창에서 /?category=dv 또는 /?category=ps 형태의 쿼리스트링은 딕셔너리 형태로 구성되어있다.
여기서 밸류값인 dv 또는 ps를 가져오기 위해 작성한다. 그럼 변수 category에 담길 것이다.
1 | article_list = Article.objects.filter(category=category) | cs |
변수 값으로 필터하여 카테고리에 따라 게시글 리스트를 만들 수 있게 되었다.
5. 카테고리에 링크를 걸기 위해 전면 수정
1) View에서 카테고리 리스트 수정
1 2 3 4 | category_list = set([ article.category, article.get_category_display() for article in article_list ]) | cs |
축약형을 리스트에 새로 넣었다. 카테고리 주소에서 단축형로 쓰이므로
2) Templete에서 카테고리에 링크 걸기
1 2 3 | {% for alias, category in category_list %} <li><a href="/{{ alias }}/">{{ category }}</a></li> {% endfor %} | cs |
단축형, 정식형 순으로 변수로 지정되었으므로 매핑된 경우에도 순서대로 값이 반영된다.
'코딩 연습 > Django' 카테고리의 다른 글
게시글 테이블에서 댓글 테이블로 접근(역으로 접근하기) (0) | 2018.11.22 |
---|---|
게시글과 해시태그 사이의 ManyToMany 관계 (0) | 2018.11.21 |
애플리케이션 설계하기 (0) | 2018.11.16 |
장고 개념 (0) | 2018.11.15 |
깃허브 활용하기 2 - 가상환경 폴더 .gitignore에 추가하기 (0) | 2018.10.22 |