Рамки отдыха и шаблоны URL - PullRequest
0 голосов
/ 02 марта 2020

Я изучаю 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?

1 Ответ

0 голосов
/ 02 марта 2020

Что ж, после долгих попыток я подумал, что, возможно, у меня что-то не так с миграциями, и после того, как я наконец попытался сделать это, Django дал мне предупреждение об использовании шаблонов URL. Похоже, начиная с какой-то версии, мне нужно использовать re_path вместо обычного path для использования именованных первичных ключей (возможно, я ошибаюсь с терминами, но дело было в ?P<...> в шаблоне). Так что теперь мой URL выглядит как re_path(r'(?P<post_id>\d+)/addcomment/', views.CommentViewSet.as_view({'post': 'addcomment'}), name='add-comment'). И это прекрасно работает.

...