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: Шаблон PostListView -> нажмите delete -> PostDeleteView подтвердите удаление шаблона -> вернитесь к шаблону PostListView .
- Случай 2: шаблон PersonalPostListView -> нажмите удалить -> PostDeleteView подтвердите удаление шаблона -> вернитесь к шаблону PersonalPostListView .
- Случай 3 ( исключение): Шаблон PostDetailView -> нажмите удалить -> шаблон PostDeleteView подтвердите удаление -> вернитесь к шаблону PostListView .
Кроме того, 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 ...
соответствующим образом.