1. 程式人生 > >django admin擴充套件-自定義後臺管理介面

django admin擴充套件-自定義後臺管理介面

建立自定義管理檢視

現在,想要往Django的admin管理介面新增自定義行為的人,可能開始覺得有點奇怪了。我們這裡所講的都是如何改變admin管理介面的外觀。他們都在喊:如何才能改變admin管理介面的內部工作機制。

首先要提的一點是,這並不神奇。admin管理介面並沒有做任何特殊的事情,它只不過是和其他一些檢視一樣,簡單地處理資料而已。

確實,這裡有相當多的程式碼; 它必須處理各種各樣的操作,欄位型別和設定來展示模型的行為. 當你注意到ADMIN介面只是一系列檢視(Views)的集合,增加自定義的管理檢視就變得容易理解了。

作為舉例,讓我們為第六章中的圖書申請增加一個出版商報告的檢視。建立一個admin檢視用於顯示被出版商分好類的書的列表,一個你要建立的自定義admin報告檢視的極典型的例子。

首先,在我們的URLconf中連線一個檢視。插入下面這行:

(r'^admin/books/report/$', 'mysite.books.admin_views.report'),

在將這行加入這個admin檢視之前,原本的URLconf應該是這樣:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^admin/bookstore/report/$', 'bookstore.admin_views.report'),
    (r'^admin/', include('django.contrib.admin.urls')),
)

為什麼要將定製試圖置於管理內容 之前 呢?回想一下,Django 是按照順序處理 URL 匹配式的。管理內容幾乎匹配內容點之後所有的東西,因此如果我們把這幾行的順序顛倒一下, Django 將會為該匹配式找到一個內建管理檢視,並將試圖在 books 應用程式中為 Report 模型再入更新列表,而這卻是不存在的。

現在我們開始寫檢視。為了簡單起見,我們只把所有書籍載入到上下文中,讓模板用 {% regroup %} 標籤來處理分組操作。建立 books/admin_views.py 檔案並寫入以下內容:

from mysite.books.models import Book
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.contrib.admin.views.decorators import staff_member_required


def report(request):
    return render_to_response(
        "admin/books/report.html",
        {'book_list' : Book.objects.all()},
        RequestContext(request, {}),
    )
report = staff_member_required(report)

因為我們把分組操作留給了模板,該檢視非常簡單。然而,有幾段微妙的細節值得我們搞清楚。

我們使用了 django.contrib.admin.views.decorators 中的 staff_member_required 修飾器。該修飾器與第 12 章中討論的 login_required 類似,但它還檢查所指定的使用者是否標記為內部人員,以決定是否允許他訪問管理介面。

該修飾器保護所有內容的管理檢視,並使得檢視的身份驗證邏輯匹配管理介面的其它部分。

我們在 admin/ 之下解析了一個模板。儘管並非嚴格要求如此操作,將所有管理模板分組放在 admin 目錄中是個好的做法。我們也將應用程式所有的模板放置在名叫 books 的目錄中,這也是最佳實踐。

我們將 RequestContext 用作 render_to_response 的第三個引數(``context_instance`` )。這就確保了模板可訪問當前使用者的資訊。

參看第十章瞭解更多關於 RequestContext 的資訊。

最後, 我們為這個檢視做一個模板。我們將擴充套件內建管理模板, 以使該檢視明確地成為管理介面的一部分.

{% extends "admin/base_site.html" %}

{% block title %}List of books by publisher{% endblock %}

{% block content %}
<div id="content-main">
  <h1>List of books by publisher:</h1>
  {% regroup book_list|dictsort:"publisher.name" by publisher as books_by_publisher %}
  {% for publisher in books_by_publisher %}
    <h3>{{ publisher.grouper }}</h3>
    <ul>
      {% for book in publisher.list|dictsort:"title" %}
        <li>{{ book }}</li>
      {% endfor %}
    </ul>
  {% endfor %}
</div>
{% endblock %}

通過擴充套件 admin/base_site.html , 我們沒費絲毫氣力就得到了 Django 管理介面的外觀。圖 17-2 我展示了像這樣的一個最終結果。

Screenshot of the custom books by publisher view.

圖 17-2. 一個自定義按出版商歸類的圖書管理檢視

使用該技術,你可以向管理介面中新增任何你夢想中的東西。需要記住的是這些被叫做定製管理檢視實際不過是普通的 Django 檢視,你可以使用在本書其它部分所學到的技術製作出符合自己需要的複雜管理介面。

NoDfRJ <a href=”http://thqkptacnajx.com/“>thqkptacnajx</a>, [url=http://nzmzfxpjthdw.com/]nzmzfxpjthdw[/url], [link=http://tzhqwsstouds.com/]tzhqwsstouds[/link], http://zawmkcrwvvzm.com/