Что я попробовал и ожидал результат: < /strong> < /h3>
- Сообщения в блоге:
- Используемый axios.get ('http://127.0.0.1:8000/api/blogs/') inside useeffect () .
- Я ожидал, что посты будут загружаться, но они не появляются.
< /li>
Ожидаемое удаление блога для работы, но столкнулась с ошибками. < /P>
< /li>
< /ul>
< /li>
< Сильная> Система комментариев:
Реализованный раздел комментариев с использованием axios.post () для отправки новых комментариев, но ничего отображается во всех его просто застрявших, говоря, что загрузка. < /p>
< /li>
Ожидаемые комментарии для отображения, но они не появляются. < /p>
@api_view(['GET', 'POST'])
@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
def blog_comments(request, blog_id):
"""
GET /blogs//comments/
Returns: All comments for specified blog
POST /blogs//comments/
Required data: content, parent (optional for replies)
Returns: Created comment data
Requires: Authentication Token
"""
blog = get_object_or_404(Blog, id=blog_id)
if request.method == 'GET':
comments = Comment.objects.filter(blog=blog, parent=None)
serializer = CommentSerializer(comments, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = CommentSerializer(data=request.data)
if serializer.is_valid():
serializer.save(blog=blog, author=request.user)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['DELETE'])
@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
def delete_comment(request, comment_id):
"""
DELETE /blogs//comments//
Deletes specified comment if user is author
Requires: Authentication Token
Returns: 204 No Content on success
"""
comment = get_object_or_404(Comment, id=comment_id)
if comment.author != request.user:
return Response({'detail': 'Permission denied'}, status=status.HTTP_403_FORBIDDEN)
comment.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
< /code>
frontend < /p>
import React, { useState, useEffect, useContext } from 'react';
import { useParams } from 'react-router-dom';
import axios from 'axios';
import { UserContext } from '../../context/UserContext';
const BlogPost = () => {
const { id } = useParams();
const [blog, setBlog] = useState(null);
const [comments, setComments] = useState([]);
const [newComment, setNewComment] = useState('');
const { user } = useContext(UserContext);
useEffect(() => {
fetchBlogPost();
}, []);
const fetchBlogPost = async () => {
try {
const [blogResponse, commentsResponse] = await Promise.all([
axios.get(`http://127.0.0.1:8000/api/blogs/${id}/`),
axios.get(`http://127.0.0.1:8000/api/blogs/${id}/comments/`, {
headers: user ? { 'Authorization': `Token ${user.token}` } : {}
})
]);
setBlog(blogResponse.data);
setComments(commentsResponse.data || []);
} catch (error) {
console.error('Error fetching blog post:', error);
}
};
const handleCommentSubmit = async (e) => {
e.preventDefault();
if (!user) {
alert("You must be logged in to comment.");
return;
}
try {
const response = await axios.post(
`http://127.0.0.1:8000/api/blogs/${id}/comments/`,
{ content: newComment },
{ headers: { 'Authorization': `Token ${user.token}` } }
);
setComments([response.data, ...comments]);
setNewComment('');
} catch (error) {
console.error('Error posting comment:', error);
}
};
const handleDeleteComment = async (commentId) => {
try {
await axios.delete(
`http://127.0.0.1:8000/api/blogs/${id}/c ... ommentId}/`,
{ headers: { 'Authorization': `Token ${user.token}` } }
);
setComments(comments.filter(comment => comment.id !== commentId));
} catch (error) {
console.error('Error deleting comment:', error);
}
};
if (!blog) return Loading...;
return (
{blog.title}
{blog.content}
Comments
{user && (
setNewComment(e.target.value)}
placeholder="Add a public comment..."
required
/>
Comment
)}
{comments.length > 0 ? (
comments.map((comment) => (
{comment.author}: {comment.content}
handleDeleteComment(comment.id)}>Delete
))
) : (
No comments yet.
)}
);
};
export default BlogPost;
< /code>
api - urls.py < /p>
from django.urls import path
from .views import blog_comments, delete_comment
urlpatterns = [
path('blogs//comments/', blog_comments, name='blog_comments'),
path('blogs//comments//', delete_comment, name='delete_comment'),
]
Подробнее здесь: https://stackoverflow.com/questions/794 ... ot-working