在管理站点中重定向

Posted

技术标签:

【中文标题】在管理站点中重定向【英文标题】:Redirecting in Admin Site 【发布时间】:2010-12-04 16:14:20 【问题描述】:

我有一个名为 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),

还有什么想法吗?

【问题讨论】:

【参考方案1】:

在您的 admin 子类中,覆盖 response_change 和/或 response_add 方法。它们在管理表单保存后调用,分别针对现有实例和新实例,并负责返回当前将您带到 change_list 页面的HttpResponseRedirect

看看django.contrib.admin.options中的原始代码,看看你需要做什么。

编辑:有两种方式可以删除:作为change_list页面上的操作的结果,在这种情况下您可以使用response_action方法;或由于更改表格上的删除,不幸的是在这种情况下没有等效的方法。处理此问题的一种方法可能是覆盖应用程序的change_form.html 模板,并删除删除链接,以便删除的唯一方法是通过更改列表。无论如何都不理想。

【讨论】:

或者至少回答了一半:删除后如何重定向?【参考方案2】:

问题已经回答了,但删除后重定向的问题没有涉及。也许以下解决方案会对某人有所帮助。 Django 的ModelAdmin 类有delete_view 成员函数。它做了两件事:

    如果未定义POST,则显示删除确认页面。如果您确认并点击删除,它会生成一个POST 请求。 由于现在定义了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 下它似乎对我有用。

【讨论】:

Django 1.6 的好解决方案 仍然在 Django-2.2 中工作,尽管response_delete 是最合适的覆盖方法,根据@Patrick answer。【参考方案3】:

从 Django 1.7 开始,有一个 response_delete 方法,您可以覆盖管理对象。见here

class MyAdmin(admin.ModelAdmin):

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

【讨论】:

以上是关于在管理站点中重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何从 DIV 重定向并绕过子锚点 href

301 重定向最佳实践 - 多个站点到单个站点

.htaccess 重定向 .php 和 .html 请求

单点登录与权限管理本质:HTTP重定向

重定向后如何管理 JWT?

Vue路由重定向、别名与导航守卫