add reverse book-bookshelf relationship + nav
parent
0275e13a96
commit
afe81a2e91
|
@ -13,3 +13,7 @@
|
||||||
background: green;
|
background: green;
|
||||||
margin-right: 20%;
|
margin-right: 20%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.nav-item.left {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
|
@ -2,11 +2,10 @@
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
|
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
|
||||||
<h2>All Bookshelves</h2>
|
<h1>All Bookshelves</h1>
|
||||||
|
|
||||||
<strong>Number of Bookshelves:</strong> <p>{{ total }}</p>
|
<strong>Number of Bookshelves:</strong> <p>{{ total }}</p>
|
||||||
|
|
||||||
<h1>Book List</h1>
|
|
||||||
{% if bookshelves %}
|
{% if bookshelves %}
|
||||||
<ul>
|
<ul>
|
||||||
{% for bookshelf in bookshelves %}
|
{% for bookshelf in bookshelves %}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
{% extends "generic_template.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
|
||||||
|
<h1>{{bookName}}</h1>
|
||||||
|
<h2>Bookshelves this book belongs to:</h2>
|
||||||
|
|
||||||
|
<strong>Number of bookshelves it belongs to:</strong> <p>{{ total }}</p>
|
||||||
|
|
||||||
|
{% if bookshelves %}
|
||||||
|
<ul>
|
||||||
|
{% for bookshelf in bookshelves %}
|
||||||
|
<li>
|
||||||
|
<a href="/bookshelves/{{ bookshelf.id }}">{{ bookshelf.bookshelf }}</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>This book is not in any bookshelves.</p>
|
||||||
|
{% endif %}
|
||||||
|
{% load static %}
|
||||||
|
<script src="{% static 'booklist.js' %}"></script>
|
||||||
|
<link rel="stylesheet" href="{% static 'style.css' %}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,38 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
{% block title %}<title>Local Library</title>{% endblock %}
|
{% block title %}<title>Gutenberg - Bookshelf Managment</title>{% endblock %}
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
|
||||||
<!-- Add additional CSS in static file -->
|
<!-- Add additional CSS in static file -->
|
||||||
{% load static %}
|
{% load static %}
|
||||||
<link rel="stylesheet" href="{% static 'style.css' %}">
|
<link rel="stylesheet" href="{% static 'style.css' %}">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
<a class="navbar-brand" href="#">Bookshelf Management</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
|
<ul class="navbar-nav">
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/"> <span class="sr-only">(current)</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/books">Lookup Books</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/bookshelves">Bookshelves</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item left">
|
||||||
|
<a class="nav-link" href="/login">Login</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<h1>Search Books</h1>
|
<h1>Search Books</h1>
|
||||||
<strong>Number of Books found:</strong> <p>{{ total }}</p>
|
<strong>Number of Books found:</strong> <p>{{ total }}</p>
|
||||||
|
|
||||||
<form action="/bookshelves/{{bookshelfId}}/search" method="post">
|
<form action="/books" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{{ form }}
|
{{ form }}
|
||||||
<input type="submit" value="Search">
|
<input type="submit" value="Search">
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
<ul>
|
<ul>
|
||||||
{% for book in books %}
|
{% for book in books %}
|
||||||
<li class="bookshelf-entry" id="book-{{ book.id }}">
|
<li class="bookshelf-entry" id="book-{{ book.id }}">
|
||||||
<a href="https://www.gutenberg.org/ebooks/{{ book.id }}">{{ book.title }}</a>
|
<a href="/books/{{ book.id }}">{{ book.title }}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
{% extends "generic_template.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
|
||||||
|
<h1>Search Books</h1>
|
||||||
|
<strong>Number of Books found:</strong> <p>{{ total }}</p>
|
||||||
|
|
||||||
|
<form action="/bookshelves/{{bookshelfId}}/search" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form }}
|
||||||
|
<input type="submit" value="Search">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<h1>Book List</h1>
|
||||||
|
{% if books %}
|
||||||
|
<ul>
|
||||||
|
{% for book in books %}
|
||||||
|
<li class="bookshelf-entry" id="book-{{ book.id }}">
|
||||||
|
<a href="https://www.gutenberg.org/ebooks/{{ book.id }}">{{ book.title }}</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>There are no books found.</p>
|
||||||
|
{% endif %}
|
||||||
|
{% load static %}
|
||||||
|
<!-- <script src="{% static 'booklist.js' %}"></script> -->
|
||||||
|
<link rel="stylesheet" href="{% static 'style.css' %}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -52,13 +52,55 @@ def booksInBookshelf(request, bookshelfId):
|
||||||
|
|
||||||
return render(request, 'bookshelf.html', context=context)
|
return render(request, 'bookshelf.html', context=context)
|
||||||
|
|
||||||
def searchBooks(request, bookshelfId):
|
def bookshelvesOfBook(request, bookId):
|
||||||
|
bookName = Book.objects.get(id=bookId).title
|
||||||
|
idList = BookshelfToBook.objects.filter(fk_books=bookId).values_list('fk_bookshelves', flat=True)
|
||||||
|
bookshelves = Bookshelf.objects.filter(id__in=idList)
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'bookshelves': bookshelves,
|
||||||
|
'total': len(bookshelves),
|
||||||
|
'bookName': bookName,
|
||||||
|
'bookId': bookId
|
||||||
|
}
|
||||||
|
|
||||||
|
return render(request, 'bookshelvesOfBook.html', context=context)
|
||||||
|
|
||||||
|
def searchBooksToAdd(request, bookshelfId):
|
||||||
context = {
|
context = {
|
||||||
'books': None,
|
'books': None,
|
||||||
'total': 0,
|
'total': 0,
|
||||||
'bookshelfId': bookshelfId
|
'bookshelfId': bookshelfId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
# create a form instance and populate it with data from the request:
|
||||||
|
form = (request.POST)
|
||||||
|
# print(form)
|
||||||
|
# check whether it's valid:
|
||||||
|
if form.get('searchTerm') != None:
|
||||||
|
foundBooks = getBooksMatchingTitle(form.get('searchTerm'))
|
||||||
|
context['books'] = foundBooks
|
||||||
|
context['total'] = len(foundBooks)
|
||||||
|
context['form'] = BookSearchForm()
|
||||||
|
|
||||||
|
# redirect to a new URL:
|
||||||
|
return render(request, 'search.html', context=context)
|
||||||
|
|
||||||
|
# if a GET (or any other method) we'll create a blank form
|
||||||
|
else:
|
||||||
|
form = BookSearchForm()
|
||||||
|
context['form'] = form
|
||||||
|
|
||||||
|
return render(request, 'searchToAdd.html', context=context)
|
||||||
|
|
||||||
|
|
||||||
|
def searchBooks(request):
|
||||||
|
context = {
|
||||||
|
'books': None,
|
||||||
|
'total': 0,
|
||||||
|
}
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
# create a form instance and populate it with data from the request:
|
# create a form instance and populate it with data from the request:
|
||||||
form = (request.POST)
|
form = (request.POST)
|
||||||
|
@ -82,10 +124,10 @@ def searchBooks(request, bookshelfId):
|
||||||
|
|
||||||
|
|
||||||
def getBooksMatchingTitle(term):
|
def getBooksMatchingTitle(term):
|
||||||
return Book.objects.filter(title__contains=term)
|
return Book.objects.filter(title__contains=term).order_by('title')
|
||||||
|
|
||||||
def bookshelfList(request):
|
def bookshelfList(request):
|
||||||
bookshelves = Bookshelf.objects.all()
|
bookshelves = Bookshelf.objects.all().order_by('bookshelf')
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'bookshelves': bookshelves,
|
'bookshelves': bookshelves,
|
||||||
|
|
|
@ -23,7 +23,9 @@ from django.conf.urls import include
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('bookshelves', views.bookshelfList, name='detail'),
|
path('bookshelves', views.bookshelfList, name='detail'),
|
||||||
path('bookshelves/<int:bookshelfId>/search', views.searchBooks, name='detail'),
|
path('books', views.searchBooks, name='detail'),
|
||||||
|
path('books/<int:bookId>', views.bookshelvesOfBook, name='detail'),
|
||||||
|
path('bookshelves/<int:bookshelfId>/search', views.searchBooksToAdd, name='detail'),
|
||||||
path('bookshelves/<int:bookshelfId>', views.booksInBookshelf, name='detail')
|
path('bookshelves/<int:bookshelfId>', views.booksInBookshelf, name='detail')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue