как настроить редирект в DeleteView - PullRequest
0 голосов
/ 06 октября 2019

когда я пытаюсь удалить какой-либо комментарий, он сначала переходит на comment_delete_confirm.html, а затем перенаправляет на страницу, на которую ссылается success_url = '/ blog /'. Проблема возникает, когда я меняю success_url на что-то вроде 'post-detail' (потому что я хочу после того, как comment_delete_confirm вернусь к сообщению), он не может найти эту страницу, потому что в URL-адресе браузера это выглядит так: '127.0.0.1:8000/blog/ post / 18 / comment_delete / post-detail '

это мои файлы views.py и urls.py:

class CommentDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Comment
    success_url = 'post-detail'
    # only the author can delete his post
    # if not author try to delete post it gives 403 forbidden
    def test_func(self):
        comment = self.get_object()
        if self.request.user == comment.user:
            return True
        return False

urlpatterns = [
    path('', PostListView.as_view(), name='blog-home'),
    path('user/<str:username>', UserPostListView.as_view(), name='user-posts'),
    path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
    path('post/new/', PostCreateView.as_view(), name='post-create'),
    path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
    path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
    path('post/<int:pk>/comment/', add_comment, name='comment-create'),
    path('post/<int:pk>/comment_update/', comment_update, name='comment-update'),
    path('post/<int:pk>/comment_delete/', CommentDeleteView.as_view(), name='comment-delete')
]

1 Ответ

0 голосов
/ 06 октября 2019

Вам нужно использовать фактический URL, а не имя. Для этого вы можете использовать reverse_lazy.

from django.urls import reverse_lazy

class CommentDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Comment
    success_url = reverse_lazy('post-detail')

Редактировать

Если вам нужны динамические данные, вы можете переопределить get_success_urlметод вместо определения атрибута напрямую. Там у вас есть доступ к self.object (потому что метод вызывается до фактической обработки удаления). Предполагая, что у вашего объекта комментария есть поле post, которое является внешним ключом для Post:

def get_success_url(self):
    return reverse('post-detail', kwargs={'pk': self.object.post_id}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...