블로그를 따라 만드는 중에 카테고리 페이지를 구현하는데서 막혔다. 


이를 공부하다보니 카테고리 리스트 구현이 궁금해 뒤돌아가서 익히고,


카테고리 테이블이 별도로 없는 걸 다시 알고 모델도 또 공부했다.


공부하고 잊히고 다시 알게 되는 중이다. 알고보니 내가 대충 공부했던 것이다.


역으로 공부했으니 복습은 정방향으로 기록하겠다.


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


단축형, 정식형 순으로 변수로 지정되었으므로 매핑된 경우에도 순서대로 값이 반영된다.






블로그 이미지

쵸잇

,