在管理站点中重定向

时间:2009-10-07 15:22:56

标签: django django-admin django-templates

我有一个名为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 个答案:

答案 0 :(得分:10)

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

查看django.contrib.admin.options中的原始代码,了解您需要做什么。

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

答案 1 :(得分:5)

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

  1. 如果未定义POST,则会显示删除确认页面。如果您确认并单击删除,则会生成POST请求。
  2. 现在定义了POST,视图会删除请求的项目,并返回HttpResponseRedirect到更改列表(如果用户没有更改权限,则返回管理员索引)。
  3. 所以,让我们重写如下。

    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下,它似乎对我有用。

答案 2 :(得分:4)

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

class MyAdmin(admin.ModelAdmin):

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