Почему не находит страницу?
изучите пеп8 - там четко указано как нужно именовать функции#
    url(r'^$', views.BookList, name='BookList'),
    url(r'^category/(?P<category_slug>[-\w]+)/$', views.BookList, name='BookListByCategory'),
    url(r'^book/(?P<id>\d+)/(?P<slug>[-\w]+)/$', views.BookDetail, name='BookDetail'),
    url(r'^contacts/$', views.ContactsPage, name='ContactsPage'),
В Django регулярки проверяются по порядку и при первом совпадении вызывают представление.
Когда пользователь в URL напишет /contacts/ - то это это будет соответствовать шаблону:url(r'^(?P<category_slug>[-\w]+)/$', views.BookList, name='BookListByCategory')
Поэтому срабатывает представление BookList. Внутри у вас скорее всего написано что-то вроде:category = get_object_or_404(Category, slug=category_slug)
Что и вызывает 404 ошибку, так как категории contacts не существует.
Исправить легко, нужно просто перенести последнюю строку наверх. Главное, чтобы у вас потом не появилась категория с slug='contacts'.urlpatterns = [
    url(r'^contacts/$', views.ContactsPage, name='ContactsPage'),
    url(r'^$', views.BookList, name='BookList'),
    url(r'^(?P<category_slug>[-\w]+)/$', views.BookList, name='BookListByCategory'),
    url(r'^(?P<id>\d+)/(?P<slug>[-\w]+)/$', views.BookDetail, name='BookDetail')
]