在管理站点中重定向
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")
【讨论】:
以上是关于在管理站点中重定向的主要内容,如果未能解决你的问题,请参考以下文章