Django DeleteView success_url на предыдущую/другую страницу

У меня есть такие шаблоны url:

app_name = "posts"
urlpatterns = [
    path('global/', PostListView.as_view(), name='global-list'),
    path('personal/', PersonalPostListView.as_view(), name='personal-list'),
    path('<int:pk>/', PostDetailView.as_view(), name='detail'),
    path('<int:pk>/delete/', PostDeleteView.as_view(), name='delete'),
]

Внутри каждого из шаблонов PostListView, PersonalPostListView и PostDetailView есть опция удаления, как показано ниже:

<a href="{% url 'posts:delete' object.id %}">Delete</a>

Я хочу, чтобы после удаления объекта он перенаправлялся на последнюю страницу, на которой была нажата ссылка на удаление (кроме детального просмотра). Таким образом, возможны 3 следующих случая:

  1. Случай 1: Шаблон PostListView -> нажмите delete -> PostDeleteView подтвердите удаление шаблона -> вернитесь к шаблону PostListView
  2. .
  3. Случай 2: шаблон PersonalPostListView -> нажмите удалить -> PostDeleteView подтвердите удаление шаблона -> вернитесь к шаблону PersonalPostListView
  4. .
  5. Случай 3 ( исключение): Шаблон PostDetailView -> нажмите удалить -> шаблон PostDeleteView подтвердите удаление -> вернитесь к шаблону PostListView
  6. .

Кроме того, PostListView и PersonalPostListView постраничны, и PostDeleteView должен возвращаться на страницу, с которой удален пост.

Вот моя попытка на данный момент:

class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post

    def get_success_url(self):
        return self.request.META.get('HTTP_REFERER')

Однако, нажатие кнопки delete из PostListView возвращает posts/15/delete/, что должно быть просто posts/global/. Более того, он должен возвращать posts/personal/ при удалении из шаблона PersonalPostListView и ( исключение) posts/global/ при удалении из шаблона PostDetailView.

Альтернативой, о которой я думал, является назначение разных DeleteViews (с разными success_url) для каждого шаблона. Однако это, похоже, вызовет некоторую избыточность кода, когда только success_url должен отличаться.

Я предлагаю OP использовать другую конфигурацию пути в urls.py,

path('global/<int:pk>/delete/', PostDeleteView.as_view(), name='delete-global'),
path('personal/<int:pk>/delete/', PostDeleteView.as_view(), name='delete-personal'),

Затем в представлении OP перенаправление в зависимости от url

class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post
    
   def get_success_url(self):
        if 'global' in self.request.path:
            return reverse_lazy('posts:global-list')
        else:
            return reverse_lazy('posts:personal-list')

Затем отрегулируйте <a href="{% url ... соответствующим образом.

Вернуться на верх