代码之家  ›  专栏  ›  技术社区  ›  vikingosegundo

在管理站点中重定向

  •  4
  • vikingosegundo  · 技术社区  · 17 年前

    我有一个应用程序称为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)
    

    Daniel的回答完成了一半的工作:更改文章和类别后重定向。


    一个不太优雅的解决方案:URL.py中的重定向

    def redirect_cms(response):
        return HttpResponseRedirect('/admin/cms/')
    
    urlpatterns += patterns('',
        (r'^admin/cms/article/$',redirect_cms),
    

    还有别的想法吗?

    3 回复  |  直到 7 年前
        1
  •  10
  •   Daniel Roseman    17 年前

    在你的 admin 子类,重写 response_change 和/或 response_add 方法。在保存管理表单后,分别为现有实例和新实例调用它们,并负责返回 HttpResponseRedirect 当前将转到“更改列表”页面。

    django.contrib.admin.options 看看你需要做什么。

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

        2
  •  5
  •   Anatoly Scherbakov    12 年前

    这个问题已经得到了回答,但是删除后的重定向问题没有涉及。也许下面的解决方案会对某人有所帮助。德扬戈氏 ModelAdmin 班上有 delete_view

    1. 如果 POST 删除确认 页如果您确认并单击 ,它生成一个 邮递 要求
    2. 邮递 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下为我工作。

        3
  •  4
  •   Patrick    12 年前

    从Django 1.7开始,有一个 response_delete 方法,您可以在管理对象上重写该方法。看见 here

    class MyAdmin(admin.ModelAdmin):
    
        def response_delete(self, request, obj_display):
            return HttpResponseRedirect("my_url")
    
    推荐文章