Я изучаю Django + Rest Framework и пытаюсь сделать простое приложение, но меня смущают шаблоны URL. Это просто блог с постами, голосами и комментариями. Я хочу сделать так, чтобы можно было отправлять запросы на этот шаблон URL, чтобы оставить комментарий <post_id>/addcomment
. И у меня только 404 с этим. Я могу сделать это другим способом, который намного проще, например, просто отправить идентификатор сообщения в данных запроса, но я учусь и хочу знать, как делать то, что я хочу. Я попытался переопределить метод создания моего viewset. Попытался получить post_id из URL через сериализатор, возможно, это даже невозможно. Потом я нашел декораторы действий, я не знаю, стоит ли мне использовать их здесь и почему они не работают.
модели
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.SET("deleted"))
post = models.ForeignKey(Post, on_delete=models.CASCADE)
body = models.TextField(max_length=1000)
added_on = models.DateTimeField(auto_now=True)
сериализатор
class CommentSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField('get_user')
post = serializers.SerializerMethodField('get_post')
def get_user(self):
request = self.context.get('request')
return request.user
# here I tried to get post_id from context but it doesn't work
# def get_post(self):
# post_id = self.context.get('post_id')
# post = Post.objects.filter(id=post_id)[0]
# return post
class Meta:
model = Comment
fields = ('body', 'post', 'user')
просмотров
class CommentViewSet(viewsets.ModelViewSet):
serializer_class = CommentSerializer
model = Comment
@action(detail=True, methods=['post'])
def addcomment(self, request, post_id=None):
if post_id:
post = Post.objects.filter(post=post_id)[0]
comment = Comment.objects.create(user=request.user, post=post, body=request.data.get('body'))
comment.save()
return Response({"detail": "You've left the comment!"}, status=HTTP_200_OK)
else:
return Response(status=HTTP_400_BAD_REQUEST)
URL
path(r'^{post_id}/addcomment/$', views.CommentViewSet.as_view({"post": "addcomment"}), name='add-comment')
Я тоже не знаю, как я должен объявить шаблон URL при использовании декоратора действий. Должен ли я использовать router.register
или просто еще один path
в списке urlpatterns? В документации я нашел только образец шаблона и эту строку views.CommentViewSet.as_view({"post": "addcomment"})
я нашел здесь, на StackOverflow. Я отправляю почтовые запросы на blog/1/addcomment
, а ответ 404. Чего мне здесь не хватает, так что сервер не может распознать URL?