다음으로
현재 인증되어진 사용자가 빌린 책을 보는
기능을 작성해보자.
물론 지금 책을 대출하는 기능은 없기 때문에
Django 관리자 페이지에서 데이터를 입력 해주어야 한다.
①Model
catalog/ 경로에 models.py 파일을 열어
from django.contrib.auth.models import User
borrower = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
위와 같이 Django 인증 관련 Model인 User를 import하고
Class 기반 BookInstance Model에 borrower 필드를 추가하자.
from datetime import date
@property
def is_overdue(self):
if self.due_back and date.today() > self.due_back:
return True
return False
또한 date 관련 처리를 하기 위해
datetime 객체를 import하고
반납 기간이 지났는지를 확인하는 함수인
is_overdue라는 함수를 작성해보자.
python3 manage.py makemigrations
python3 manage.py migrate
마지막으로 Model을 수정했기 때문에
다시 한번 마이그레이션 해주자.
②관리자 페이지(Admin)
관리자 페이지에 새로운 필드를 표시하기 위해
@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
list_display = ('book', 'status', 'borrower', 'due_back', 'id')
list_filter = ('status', 'due_back')
fieldsets = (
(None, {
'fields': ('book','imprint', 'id')
}),
('Availability', {
'fields': ('status', 'due_back','borrower')
}),
)
위와 같이 catalog/ 경로의 admin.py 파일에
borrower 필드를 추가 한다.
관리지 페이지에 들어가보면
BORROWER 필드가 화면에 표시됨을 알 수 있고,
나는 librarian1이라는 유저에게 두 책을 빌려주었다.
③ 대출(On loan) View
다음으로 현재 사용자가 대출하고 있는
도서 목록을 가져오는 View를 추가해보자.
from django.contrib.auth.mixins import LoginRequiredMixin
class LoanedBooksByUserListView(
LoginRequiredMixin
,generic.ListView):
"""Generic class-based view listing books on loan to current user."""
model = BookInstance
template_name ='catalog/bookinstance_list_borrowed_user.html'
paginate_by = 10
def get_queryset(self):
return BookInstance.objects.filter(borrower=self.request.user).filter(status__exact='o').order_by('due_back')
위와 같이 클래스 매개변수로서 LoginRequiredMixin을
설정했기 때문에 로그인한 사용자
즉, 인증된 사용자만 이 View를 불러올 수 있다.
template_name을 default값이 아닌
사용하지 않고 설정해주었고,
QuerySet을 현재 인증된 사용자로 제한하기 위한 필터와
(borrower=self.request.user)
status 필드의 데이터가 'o'와 일치하는 것을 찾는 필터를 추가
(filter(status__exact='o'))
그리고 due_back 필드의 데이터를 내림 차순으로 정렬한 값을
(order_by('due_back'))
즉, 가장 오래된 날짜부터 정렬 한 값을 리턴하게 코딩했다.
④ 대출 도서에 대한 URLconf
이제 URL을 추가하자.
urlpatterns += [
path('mybooks/', views.LoanedBooksByUserListView.as_view(), name='my-borrowed'),
]
위와 같이 locallibrary/catalog/ 경로
urls.py 파일에 코드를 추가 하자.
⑤ 대출 도서 Template
대출 도서를 나타내는 템플릿을 추가해보자.
{% extends "base_generic.html" %}
{% block content %}
<h1>Borrowed books</h1>
{% if bookinstance_list %}
<ul>
{% for bookinst in bookinstance_list %}
<li class="{% if bookinst.is_overdue %}text-danger{% endif %}">
<a href="{% url 'book-detail' bookinst.book.pk %}">{{bookinst.book.title}}</a> ({{ bookinst.due_back }})
</li>
{% endfor %}
</ul>
{% else %}
<p>There are no books borrowed.</p>
{% endif %}
{% endblock %}
/catalog/templates/catalog/ 경로에
bookinstance_list_borrowed_user.html 파일을 추가하고
위와 같은 코드를 추가 하자.
추가 한 후 에
빌린 목록을 포함한 연체・비 연체 목록도 알수 있다.
⑥ 사이드 바(Side Bar)에 목록 추가
마지막으로 사이드 바에
빌린 책의 목록을 볼 수 있도록 추가해보자.
/locallibrary/catalog/templates/ 경로의
base_generic.html 파일에
<ul class="sidebar-nav">
{% if user.is_authenticated %}
<li>User: {{ user.get_username }}</li>
<li><a href="{% url 'my-borrowed' %}">My Borrowed</a></li>
<li><a href="{% url 'logout'%}?next={{request.path}}">Logout</a></li>
{% else %}
<li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li>
{% endif %}
</ul>
위와 같이 코드를 추가하자.
에러가 없다면 위와 같이
사이드 바에 빨간색 박스와 같이
빌린 목록을 볼 수 있는 하이퍼 링크가 추가될 것이다.