2017-01-20 81 views
1

我非常熟悉如何覆蓋Django的管理模板,但是我一直無法找到關於如何正確覆蓋可用於上述模板的上下文的任何說明。比如這個頁面:你如何覆蓋Django的管理員app_index?

root/users/templates/admin/users/app_index.html 

但是,如果我想要什麼在之前做一些更多的Python層次的東西

/admin/users/ 

該頁面的樣式可以通過創建一個文件被覆蓋模板被加載?特別是在我的情況下,我想爲/admin/users/生成一種儀表板,爲此我需要運行一個相當複雜的查詢。

現在我知道我可以通過創建一個模板標籤,做查詢我砍這一點,但坦率地說那是因爲你打從模板數據庫中很骯髒的,所以我想這樣做更好如果存在這種方式的話。

但是,如果您能夠充滿信心地(並且令人信服地)說明,如果不重寫django.contrib.admin.sites.AdminSite.app_index,那麼我就會將您的答案標記爲正確,並隨着我的醜陋攻擊行事。

+0

我認爲覆蓋'AdminSite.app_index'將是正確的方式來做到這一點。但是,由於使用自定義管理站點註冊您的所有'ModelAdmin'是不方便的,並且猴子補丁'AdminSite'會很冒險,所以模板標籤是實用的方法。我會讓別人信服;) – Alasdair

+0

這也是我的想法,但希望我錯過了一些東西。 –

回答

1

它可以完成,而不需要重寫app_index。由於AdminSite旨在通過子類別進行定製。

看着AdminSite的實現,你可以看到app_index有一個關鍵字參數extra_context。您可以利用此爲您的目的,以避免重寫如下

from django.contrib.admin import AdminSite 

class MyAdmin(AdminSite): 
    def app_index(self, request, app_label, extra_context=None): 
     if not extra_context: 
      extra_context = {} 
     extra_context['my_new_key'] = 'val' 

     super().app_index(request, app_label, extra_context=extra_context) 

那麼問題就出現了,你將需要實例化自定義網站,並用它來設置你的URL和註冊模型管理員。如果這是Alasdair建議的不方便,您可能會考慮this

所有的說法,無論如何,你仍然會在請求上點擊數據庫,類似於你對標籤的關注。只有緩存才能解決這個問題。

+0

我不關心打到數據庫,只是它在堆棧中的適當層完成,即。而不是模板。但是這看起來是一個很好的開始。謝謝! –