Перенаправление на сайте администратора - PullRequest
5 голосов
/ 07 октября 2009

У меня есть приложение под названием CMS с категорией и статьей. Довольно просто.

Я перезаписываю app_index.html, чтобы включить упорядочение по принципу перетаскивания на основе ajax и перемещать статьи из одной категории в другую.

Теперь я хотел бы перенаправить после сохранения / удаления статьи или категории в cms 'app_index.html вместо change_list.html модели. Как это можно сделать?

Спасибо

class Category(models.Model):
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    text  = models.TextField()

class Article(models.Model):
    published  = models.BooleanField(default=None)
    images     = generic.GenericRelation(Photo)
    category = models.ForeignKey(Category)
    title = models.CharField(max_length=100)
    text  = models.TextField()
    order = models.IntegerField(blank = True, null = True)

Ответ Даниэля выполнил половину работы: перенаправление после изменения статей и категорий.


Не очень элегантное решение: перенаправление в urls.py

def redirect_cms(response):
    return HttpResponseRedirect('/admin/cms/')

urlpatterns += patterns('',
    (r'^admin/cms/article/$',redirect_cms),

есть еще идеи?

Ответы [ 3 ]

10 голосов
/ 07 октября 2009

В вашем подклассе admin переопределите методы response_change и / или response_add. Они вызываются после сохранения формы администратора для существующих и новых экземпляров соответственно и отвечают за возвращение HttpResponseRedirect, которое в настоящее время переносит вас на страницу change_list.

Взгляните на оригинальный код в django.contrib.admin.options, чтобы увидеть, что вам нужно сделать.

Редактировать : удаление может осуществляться двумя способами: в результате действия на странице change_list, в этом случае вы можете использовать метод response_action; или в результате удаления в форме изменений, в этом случае, к сожалению, нет эквивалентного метода. Одним из способов решения этой проблемы может быть переопределение шаблона change_form.html для приложения и удаление ссылки удаления, так что единственный способ удаления - через список изменений. Ни в коем случае не идеал.

5 голосов
/ 10 декабря 2013

На вопрос уже дан ответ, но проблема перенаправления после удаления не рассматривается. Возможно, кому-то будет полезно следующее решение. Класс ModelAdmin Джанго имеет delete_view функцию-член. Это делает две вещи:

  1. Если POST не определено, отображается Страница подтверждения удаления . Если вы подтвердите и нажмете Удалить , он сгенерирует запрос POST.
  2. Поскольку POST теперь определено, представление удаляет запрошенные элементы и возвращает HttpResponseRedirect в список изменений (или индекс администратора, если у пользователя нет прав на изменение).

Итак, давайте переопределим это следующим образом.

from django.http import HttpResponseRedirect

class MyAdmin(admin.ModelAdmin):
    def delete_view(self, request, object_id, extra_context=None):
        """Redirect to website index page on delete."""

        response = super(MyAdmin, self).delete_view(request, object_id, extra_context)

        # Use our own redirect
        if isinstance(response, HttpResponseRedirect):
            return HttpResponseRedirect('/') # Any URL here

        return response

Кажется, у меня работает Django 1.6.

4 голосов
/ 16 июня 2014

Начиная с Django 1.7, существует метод response_delete, который вы можете переопределить для объекта admin. Смотри здесь

class MyAdmin(admin.ModelAdmin):

    def response_delete(self, request, obj_display):
        return HttpResponseRedirect("my_url")
...