Как добавить комментарии под каждым постом в ReactJs + Django
Я хочу спросить; если я предоставляю пользователям определенный контент или сообщение, и они могут добавить ответ на это сообщение, чтобы позволить им добавить ответ, они должны указать Id для сообщения, когда они отправляют, но у меня проблема с этим;
Следующее: сначала извлекаем slug, который будет приводить контент на основе выбора пользователя, а затем присваиваем => let IdPost = data.posts.id для соответствия комментарию
const { slug } = useParams();
const [data, setData] = useState({ posts: [] });
useEffect(() => {
axios.get(slug).then((res) => {
setData({ posts: res.data });
console.log('a single post', res.data);
// author, content, id, image, published, slug, title
});
}, [slug]);
let IdPost = data.posts.id
и здесь для ввода комментария и отправки его:
const createComment = Object.freeze({
body: '',
});
const [postComment, updateComment] = useState(createComment);
const handlerOnChange = (e) => {
updateComment({
...postComment,[e.target.name]: e.target.value
});
};
const handlerOnSubmit = (event) => { event.preventDefault();
let formComment = new FormData();
formComment.append('body', postComment.body);
axios.post(`http://localhost:8000/comment/create/`, formComment, {
headers: { Authorization: `JWT ${localStorage.getItem('token')}`,
'Content-Type': 'application/json' }
})
};
этот код для перечисления комментариев:
const [Comments, setComments] = useState([]);
useEffect(() => {
axios.get("http://localhost:8000/comment/list").then((res) => {
const allComments = res.data;
setComments(allComments);
});
}, [setComments]);
const filterComments = Comments.filter((item) => item.post === IdPost);
в models.py
class Comment(models.Model):
"""Model For The Comments In The Blog Posts"""
name = models.CharField(max_length=100)
body = models.TextField()
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='post')
post = models.ForeignKey(settings.AUTH_POST_MODEL, on_delete=models.CASCADE, related_name='post')
published = models.DateTimeField(default=timezone.now)
class Meta:
def __str__(self):
return self.body
serializers.py:
class CommentSerializer(serializers.ModelSerializer):
author = StringRelatedField()
class Meta:
fields = ('id', 'post', 'published','author', 'body')
model = Comment
views.py:
class comment_list_view(generics.ListCreateAPIView):
permission_classes = [IsAuthenticatedOrReadOnly]
queryset = Comment.objects.all()
serializer_class = CommentSerializer
class comment_create_view(generics.CreateAPIView):
permission_classes = [permissions.IsAuthenticated]
serializer_class = CommentSerializer
def perform_create(self, serializer):
serializer.save(author=self.request.user)
Я могу добавить комментарий со страницы администратора "Django administration" Он отображает комментарии для каждого поста отдельно, потому что я выбираю id поста, когда пишу комментарий, но в react я не могу этого сделать Я хочу добавить комментарий на основе SinglePost.
Весь код для ReactJs:
export const SinglePost = () => {
const { slug } = useParams();
const [data, setData] = useState({ posts: [] });
useEffect(() => {
axios.get(slug).then((res) => {
setData({ posts: res.data });
console.log('a single post', res.data);
// author, content, id, image, published, slug, title
});
}, [slug]);
let IdPost = data.posts.id
const createComment = Object.freeze({
body: '',
});
const [postComment, updateComment] = useState(createComment);
const handlerOnChange = (e) => {
updateComment({
...postComment,[e.target.name]: e.target.value
});
};
const handlerOnSubmit = (event) => { event.preventDefault();
let formComment = new FormData();
formComment.append('body', postComment.body);
axios.post(`http://localhost:8000/comment/create/`, formComment, {
headers: { Authorization: `JWT ${localStorage.getItem('token')}`,
'Content-Type': 'application/json'
}
})
};
const [Comments, setComments] = useState([]);
useEffect(() => {
axios.get("http://localhost:8000/comment/list").then((res) => {
const allComments = res.data;
setComments(allComments);
});
}, [setComments]);
const filterComments = Comments.filter((item) => item.post === IdPost);
return (
<Fragment.React>
<div className="container-fluid">
<div className="row">
<div className="col-lg-12">
<img src={data.posts.image}/>
<h3> {data.posts.title}</h3>
<div>{data.posts.content}</div>
</div>
</div>
{/* THIS IS COMMENT SECTION */}
<div class="main-comment-section">
<form onSubmit={handlerOnSubmit}>
<textarea name="comments" id="comments" placeholder="comments" onChange = {handlerOnChange} rows="4" cols="50"></textarea>
<button name ="button">add Comment</button>
</form> </div>
{/* HERE map() Loop to render comments */}
......
......
......
</div>
</Fragment.React>
);
};