2009-10-07 57 views
4

我有一個名爲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) 

編輯

不,我自己的答案沒有工作。我誤解了重定向應用

編輯2

丹尼爾的回答卻一半的工作:改變物品和類別後重定向。

編輯3

一個不是很優雅的解決方案:重定向在urls.py

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

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

任何其他的想法?

回答

9

在您的admin子類中,覆蓋response_change和/或response_add方法。這些會在保存管理員表單後分別針對現有實例和新實例調用,並負責返回當前將您帶到change_list頁面的HttpResponseRedirect

看看django.contrib.admin.options的原始代碼,看看你需要做什麼。

編輯:有兩種方法的缺失可以發生:爲change_list頁面上的操作,在這種情況下,你可以使用response_action方法的結果;或作爲刪改表格的結果,在這種情況下,不幸的是沒有等效的方法。處理此問題的一種方法可能是覆蓋應用程序的change_form.html模板,並刪除刪除鏈接,這樣刪除的唯一方法就是通過更改列表。不以任何方式理想。

+0

謝謝!那是否 – vikingosegundo 2009-10-07 16:18:37

+0

或至少有一半的答案:刪除後如何重定向? – vikingosegundo 2009-10-07 16:42:52

+0

請參閱上面編輯的回覆。 – 2009-10-07 17:51:07

4

這個問題已經得到解答,但是刪除之後重定向的問題沒有涉及。也許下面的解決方案對別人會有幫助。 Django的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中,它似乎適用於我。

+0

Django 1.6的完美解決方案 – Patrick 2014-06-16 05:18:31

3

從Django 1.7開始,有一個response_delete方法,您可以在管理對象上重寫。見here

class MyAdmin(admin.ModelAdmin): 

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