Django как система -> RedirectView не перенаправляет на post

#python #django #django-models #django-class-based-views

#python #django #django-модели #представления на основе классов django

Вопрос:

Я столкнулся с проблемой, пытаясь выяснить, как реализовать систему симпатий для моего блога Django. У меня есть представление сведений о публикации и PostRedirectView. Я хочу, чтобы вид перенаправления получал абсолютный URL-адрес для сообщения, на которое я смотрю, и переключал похожее / непохожее, поскольку моя система симпатий — это ManyToManyField, связанный в моем models.py для post. Вот соответствующий код:

views.py

 class PostDetailView(DetailView):
    model = Post
    template_name = 'blog/post_detail.html'
    context_object_name = 'post'

    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        comments_connected = Comment.objects.filter(post_connected=self.get_object()).order_by('-date_posted')
        data['comments'] = comments_connected
        data['form'] = NewCommentForm(instance=self.request.user)
        return data

    def post(self, request, *args, **kwargs):
        new_comment = Comment(content=request.POST.get('content'),
                              author=self.request.user,
                              post_connected=self.get_object())
        new_comment.save()

        return self.get(self, request, *args, **kwargs)


class PostLikeRedirect(RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        obj = get_object_or_404(Post, pk=self.kwargs.get('id'))
        return obj.get_absolute_url()
  

urls.py

   path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
  path('post/<int:pk>/like', PostLikeRedirect.as_view(), name='post-like'),
  

models.py

 class Post(models.Model):
    content = models.TextField(max_length=1000)
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="users_who_authored")
    like = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="users_who_liked")

    def __str__(self):
        return f'{self.author} posts: {self.content[:8]}'

    @property
    def number_of_comments(self):
        return Comment.objects.filter(post_connected=self).count()


    def __str__(self):
        return f'{self.author} posted'
  

Ошибка, которую я получаю, заключается в том, что страница 404 не найдена, когда я перехожу к post / id (например, 2) / like и сообщение об ошибке

 No Post matches the given query.
  

Я знаю, что означает ошибка, я просто не могу точно определить точное время и где я неправильно передал запрос

Комментарии:

1. Можете ли вы добавить полную обратную трассировку ошибок ?

2. @ArakkalAbu Я сделал, это полная обратная связь, которую дал мне Django, а также те обычные 3 строки в верхнем методе запроса: ПОЛУЧИТЬ URL-адрес запроса: 127.0.0.1:8000 / post / 2 /like , созданный: blog.views. PostLikeRedirect

Ответ №1:

Вы пытаетесь получить id из URL, но он был определен как pk . Итак, измените свой вид как

 class PostLikeRedirect(RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        obj = get_object_or_404(Post, pk=self.kwargs["pk"])
                                      ^^^^^^^^^^^^^^^^^^^^^
        return obj.get_absolute_url()