"전에 작성했었던Django의 model, admin, views 기본 작성 법을 이어 정리해 보겠다
전과 마찬가지로 코드에 대한 해설은 주석으로 정리했다."
문제
- 클릭한 카테고리에 해당하는 글만 필터링하여 보여준다.
작성된 글 목록을 볼 수 있도록 templates 폴더 안에 글 제목을 리스팅하는 'article.html'을 만들고,
사용자가 'category.html'에서 클릭한 카테고리에 해당하는 글만 필터링하여 보여주도록
[Views.py](http://Views.py)과 [Urls.py](http://Urls.py)에 적절한 코드를 작성하라
- 사용자가 다른 html에서 클릭한 글에 해당하는 글의 title, comtent를 보여준다.
특정한 글의 내용을 볼 수 있도록 templates 폴더 안에 글과 제목과 내용을 보여주는 'detail.html'을 만들고,
사용자가 'article.html'에서 클릭한 글에 해당하는 제목과 내용을 보여주도록
[Views.py](http://Views.py)과 [Urls.py](http://Urls.py)에 적절한 코드를 작성하라
- 문제를 풀기 위해 알아야 할 태그
<select> 태그
<select> 태그는 <option>를 감싸 그룹을 만들 수 있다.
[ 예시(1) ]
[ 예시(2) ]
<select> 태그를 사용해 modle.py에 저장한 데이터를 가져오는법.
# option 태그 안에 하드코딩이 아니라 내가 modle.py에 저장한 데이터를 가져온다면
<select name="category">
<option value="{{ category.name(모델의 필드명) }}"> {{ catagory.name }}</option>과 같이 사용할 수 있다.
이제 문제를 풀어보자.
- 클릭한 카테고리에 해당하는 글만 필터링하여 보여준다.
url.py의 url name을 만들어 보자 name은 'article'로 정해보자
# url.py
urlpatterns = [
path('<str:name>',,,,= name = 'article'),
]
view.py에서 name 사용법, 간단한 해설
# view.py
# def ,,,(request, name) name을 추가로 작성해 준다면?
def article_view(request, name)
# 127.0.0.1/movie --> name='movie' 스트링 형태로 들어간다
# name의 부분이 변 할 수 있다. 바로 위 코드에서 url.py에서 name은 str 형태로 들어갈 수 있게 설정한걸 기억하자.
그럼 이제 view.py에서 함수 name이 'movie'라고 들어간다고 하고 코드를 작성해보자
# name에 movie가 할당이 되고
def article_view(request, name):
# db에 movie라는 카테고리가 있는지 확인한다
category = Category.objects.get(name=name) #(pk=pk) 똑같다
# 그 오브젝 찾아서 그 카테고리의 글만 나오도록 filter해준다
# 그러면 영화 카테고리의 글들만 따로 가져와
articles = Article.objects.filter(category=category)
# article.html에 띄워준다
return render(request, 'article.html', {'articles':articles})
이제 마지막으로 html만 작성해주면 끝이 난다. html은 간단하다.
# article.html
{% for article in articles %}
<h1>{{ article.title }}</h1>
{% endfor %}
- 사용자가 다른 html에서 클릭한 글에 해당하는 글의 title, comtent를 보여준다.
views.py에서 이번에는 name이 아닌 글의 순서대로 url를 나누기 위해 pk를 사용한다.
이전 문제처럼 filter를 사용하지 않아도 되므로 바로, views는 해당글만 html에 띄워주기만 하면된다.
# views.py
def detail_view(request, pk):
# pk가 1이라면 첫번째 글 가져와
article = Article.objects.get(pk=pk)
# 첫번째 글을 변수로 detail.html에 넘겨준다
return render(request, 'detail.htnl', {'article' : article})
html에서 유의할 점은 'category'는 ForinKey를 사용해 지금 데이터를 가져오면 object 형태이기 때문에
가져올 데이터를 선택해 주어야 한다.
* ForinKey 사용하는건 str 데이터를 받을 수 없다. 반드시 object를 가져와야 한다.
# detail.html
# category는 object 이기 때문에 이름을 가져오려면 .name을 붙여주어야 한다.
<p>{{ article.category.name }}</p>
# 장고에서 프론트를 사용한다면 템플릿 태그 사용하는게 좋다
<a href="{% url 'url.py에서 작성한 url의 name 사용' %}">목록으로</a>
# 만약 <str:name>, <int:pk>가 들어가 있다면
<a href="{% url 'url의 name 사용' category.name 또는 .pk라고 작성해야 한다 %}">목록으로</a>
댓글