Добрый день.
Проблема в следующем: я изучаю как сделать сайт на React+Django. И все хорошо было пока не появилась необходимость в файле который через API будет брать значения книги на страницу.
У меня
Код:
```from django.urls import path
from . import views
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_200_OK
from .models import Book, Chapter
from .serializers import BookSerializer, ChapterSerializer
from django.shortcuts import get_object_or_404
from django.http import JsonResponse
import logging
from rest_framework.decorators import api_view
@api_view(['GET', 'POST'])
def Catalog(request):
if request.method == 'GET':
books = Book.objects.all()
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
if request.method == 'POST':
serializer = BookSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=HTTP_200_OK)
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
logger = logging.getLogger(__name__)
@api_view(['GET'])
def book_detail(request, slug):
try:
book = Book.objects.get(slug=slug)
serializer = BookSerializer(book)
return JsonResponse(serializer.data, safe=False)
except Book.DoesNotExist:
return JsonResponse({'error': 'Book not found'}, status=404)
@api_view(['GET'])
def chapter_list(request, book_slug):
book = get_object_or_404(Book, slug=book_slug)
chapters = Chapter.objects.filter(book=book)
serializer = ChapterSerializer(chapters, many=True)
return Response(serializer.data, status=HTTP_200_OK)
@api_view(['GET'])
def chapter_detail(request, book_slug, chapter_slug):
book = get_object_or_404(Book, slug=book_slug)
chapter = get_object_or_404(Chapter, slug=chapter_slug, book=book)
serializer = ChapterSerializer(chapter)
return Response(serializer.data, status=HTTP_200_OK)
```
Urls.py:
Код:
``` app_name = 'catalog'
urlpatterns = [
path('', views.Catalog, name='catalog'),
path('books/<slug:slug>/', views.book_detail, name='book_detail'),
path('books/<slug:book_slug>/chapters/', views.chapter_list, name='chapter_list'),
path('books/<slug:book_slug>/chapters/<slug:chapter_slug>/', views.chapter_detail, name='chapter_detail'),
]
```
api.js:
```
import axios from 'axios';
const API_BASE_URL = 'http://localhost:8000'; // Замените на ваш фактический URL
// Получение списка книг
export const getCatalog = () => {
return axios.get(${API_BASE_URL}/catalog/);
};
// Получение деталей книги по slug
export const getBookDetail = (slug) => {
return axios.get(${API_BASE_URL}/catalog/books/${slug}/);
};
// Получение списка глав книги по slug книги
export const getChapterList = (bookSlug) => {
return axios.get(${API_BASE_URL}/catalog/books/${bookSlug}/chapters/);
};
// Получение деталей главы книги по slug книги и slug главы
export const getChapterDetail = (bookSlug, chapterSlug) => {
return axios.get(${API_BASE_URL}/catalog/books/${bookSlug}/chapters/${chapterSlug}/);
};
```
BookDetail.js:
Код:
```
import React, { useState, useEffect } from 'react';
import { getBookDetail } from '../api'; // Импорт функции для получения деталей книги
import { useParams } from 'react-router-dom'; // Для доступа к параметрам URL
const Book = () => {
const { slug } = useParams(); // Получаем slug из параметров URL
const [book, setBook] = useState(null); // Состояние для хранения данных книги
const [loading, setLoading] = useState(true); // Состояние загрузки
const [error, setError] = useState(null); // Состояние ошибки
useEffect(() => {
const fetchBookDetail = async () => {
try {
const response = await getBookDetail(slug); // Запрос к API
setBook(response.data); // Обновляем состояние с данными книги
} catch (error) {
setError('Ошибка при загрузке данных книги'); // Обрабатываем ошибки
} finally {
setLoading(false); // Завершаем загрузку
}
};
fetchBookDetail(); // Вызываем функцию при монтировании компонента
}, [slug]); // Зависимость от slug, чтобы обновлять данные при его изменении
if (loading) {
return <div>Загрузка...</div>; // Отображаем сообщение о загрузке
}
if (error) {
return <div>{error}</div>; // Отображаем сообщение об ошибке
}
if (!book) {
return <div>Книга не найдена</div>; // Если книга не найдена
}
return (
<div>
<h1>{book.title}</h1> {/* Отображаем заголовок книги */}
<p>{book.description}</p> {/* Отображаем описание книги */}
{/* Здесь можно добавить другие детали книги */}
</div>
);
};
export default Book;
```
И мне выдает ошибку 404, что не может найти:
Код:
```
api.js:12%20%0A%20GET%20http%3A//localhost:8000/catalog/books/fwegerwgergewf/%20404%20(Not%20Found)%0Aapi.js:12%20%0A%20GET%20http://localhost:8000/catalog/books/fwegerwgergewf/%20404%20(Not%20Found)
```