책 목록 Page
책 목록 페이지는
모든 사용 가능한 책 레코드들의 목록을 페이지 안에 나타낼 것이다.
해당 페이지는 catalog/books/로 접근하며,
각 레코드마다 제목과 저자를 나타내고
제목은 관련된 책 페이지로 이동하게 끔 하이퍼 링크 처리를 할 것이다.
① URL Mapping
/catalog/urls.py 파일을 열어 아래와 같이 코드를 추가한다.
urlpatterns = [
path('', views.index, name='index'),
path('books/', views.BookListView.as_view(), name='books'),
]
이전 공식 도큐먼트 튜토리얼에서도 사용했던
Java의 인터페이스와 비슷하게
Django에서 지원하는 오버라이딩 할 수 있는 제네릭 뷰이다.
Django의 클래스 기반 View에서는 as_view() 클래스 메소드를 호출해
적절한 View함수에 접근할 수 있다.
② View(클래스 기반)
catalog/views.py 파일에 아래와 같은 코드를 추가해보자.
from django.views import generic
class BookListView(generic.ListView):
model = Book
이제 코딩한 모델 Book으로 부터 모든 레코드를 가져오기 위해
데이터베이스를 쿼리할 것이다.
역시 함수 기반보다 클래스 기반의 제너릭 뷰가
확실히 깔끔하다는 것을 느낄 수 있다.
class BookListView(generic.ListView):
model = Boo
context_object_name = 'my_book_list' # your own name for the list as a template variable
queryset = Book.objects.filter(title__icontains='war')[:5] # Get 5 books containing the title war
template_name = 'books/my_arbitrary_template_name_list.html' # Specify your own template name/location
또한 같은 모델을 사용하지만
여러 개의 뷰를 사용해야 하는 경우 혹은
book_list 템플릿 변수명이 마음에 들지 않는 경우,
위와 같이 다른 템플릿의 파일을 명시할 수 도 있다.
③ 클래스 기반 뷰의 메소드 오버라이딩
위에서 잠깐 언급했듯이
메소드 오버라이딩도 가능하다.
class BookListView(generic.ListView):
model = Book
def get_queryset(self):
return Book.objects.filter(title__icontains='war')[:5] # Get 5 books containing the title war
예를 들어,
get_queryset() 메소드를 오버라이딩 해
반환되는 레코드 리스트를
위와 같이 바꿀 수도 있다.
또한 템플릿에 추가적인 컨텍스트 변수들을 전달하기 위해
class BookListView(generic.ListView):
model = Book
def get_context_data(self, **kwargs):
# Call the base implementation first to get the context
context = super(BookListView, self).get_context_data(**kwargs)
# Create any data and add it to the context
context['some_data'] = 'This is just some data'
return context
get_context_data() 함수를 오버라이딩 할 수도 있다.
이에 대한 자세한 사항은
아래 링크의 공식 도큐먼트를 참고하기 바란다.
④ 리스트 뷰 템플릿 생성하기
/locallibrary/catalog/tempates/catalog/book_list.html 경로에
아래와 같이 파일 및 코드를 추가해보자.
{% extends "base_generic.html" %}
{% block content %}
<h1>Book List</h1>
{% if book_list %}
<ul>
{% for book in book_list %}
<li>
<a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})
</li>
{% endfor %}
</ul>
{% else %}
<p>There are no books in the library.</p>
{% endif %}
{% endblock %}
⑤ 조건부 실행
if, else 그리고 endif 템플릿 태그들은
book_list가 정의되었는지,
그리고 존재하는지 체크할 수 있다.
{% if book_list %}
<!-- code here to list the books -->
{% else %}
<p>There are no books in the library.</p>
{% endif %}
위의 조건문에 elif를 추가한다면
추가적인 조건을 걸 수 있다.
⑥ 반복 구문
{% for book in book_list %}
<li> <!-- code here get information from each book item --> </li>
{% endfor %}
for와 endfor 라는 템플릿 태그들은
위와 같이 도서 목록을 살펴보기 위해 사용할 수 있다.
⑦ 변수 접근
반복 구문 내에서의 코드는
각 책에 대한 리스트 아이템을 생성한다.
이 리스트 아이템은 타이틀과 작가 이름을 나타낸다.
<a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})
⑧ 베이스 템플릿 업데이트
base_generic.html에 아래와 같이 코드를 추가한다.
<li><a href="{% url 'index' %}">Home</a></li>
<li><a href="{% url 'books' %}">All books</a></li>
<li><a href="">All authors</a></li>