http://blog.csdn.net/pipisorry/article/details/45079751
Introduction
對於某一類站點, 管理界面 是基礎設施中很重要的一部分。
這是以網頁和有限的可信任管理者為基礎的界面,它能夠讓你加入,編輯和刪除站點內容。
常見的樣例: 你能夠用這個界面公布博客,后台的站點管理者用它來潤色讀者提交的內容,你的客戶用你給他們建立的界面工具更新新聞並公布在站點上。這些都是使用管理界面的樣例。
創建管理界面一般是千篇一律的。
你必須認證用戶,顯示並管理表格,驗證輸入的有效性諸如此類。Django 的自己主動管理界面: 它讀取你模式中的元數據。然后提供給你一個強大可使用的界面,站點管理者能夠用它馬上工作。
django.contrib包
Django自己主動管理工具是django.contrib的一部分。
django.contrib是一套龐大的功能集。它是Django基本代碼的組成部分。Django框架就是由眾多包括附加組件(add-on)的基本代碼構成的。
管理工具是講述django.contrib的第一個部分。
從技術層面上講,它被稱作django.contrib.admin。django.contrib中其他可用的特性,如用戶鑒別系統(django.contrib.auth)、支持匿名會話(django.contrib.sessioins)以及用戶評注系統(django.contrib.comments)。
第十六章具體討論。Django自帶非常多優秀的附加組件,它們都存在於django.contrib包里。
Admin是怎樣工作的
當服務啟動時,Django從`` url.py`` 引導URLconf。然后運行`` admin.autodiscover()`` 語句。 這個函數遍歷INSTALLED_APPS配置。而且尋找相關的admin.py文件。
假設在指定的app文件夾下找到admin.py,它就運行當中的代碼。
在`` books`` 應用程序文件夾下的`` admin.py`` 文件里。每次調用`` admin.site.register()`` 都將那個模塊注冊到管理工具中。 管理工具僅僅為那些明白注冊了的模塊顯示一個編輯/改動的界面。
應用程序`` django.contrib.auth`` 包括自身的`` admin.py`` ,所以Users和Groups能在管理工具中自己主動顯示。 其他的django.contrib應用程序。從網上下的第三方Django應用程序一樣,都會自行加入到管理工具。
綜上所述。管理工具事實上就是一個Django應用程序,包括自己的模塊、模板、視圖和URLpatterns。
你要像加入自己的視圖一樣,把它加入到URLconf里面。 你能夠在Django基本代碼中的django/contrib/admin 文件夾下,檢查它的模板、視圖和URLpatterns,但你不要嘗試直接改動當中的不論什么代碼,由於里面有非常多地方能夠讓你自己定義管理工具的工作方式。
激活管理界面
Django管理網站全然是可選擇的。由於只某些特殊類型的網站才須要這些功能。
改動settings文件
1. 將 'django.contrib.admin'增加setting的 INSTALLED_APPS配置中 ( INSTALLED_APPS中的配置順序是沒有關系的)2. 保證 INSTALLED_APPS中包括 'django.contrib.auth', 'django.contrib.contenttypes'和 'django.contrib.sessions'。Django的管理工具須要這3個包。確保 MIDDLEWARE_CLASSES 包括 'django.middleware.common.CommonMiddleware' 、 'django.contrib.sessions.middleware.SessionMiddleware' 和 'django.contrib.auth.middleware.AuthenticationMiddleware' 。
3. 執行 python manage.py syncdb。這一步將生成管理界面使用的額外數據庫表。
當你把'django.contrib.auth'加進INSTALLED_APPS后,第一次執行syncdb命令時, 系統會請你創建一個超級用戶。 假設你不這么作,你須要執行python manage.py createsuperuser來另外創建一個admin的用戶帳號,否則你將不能登入admin
Note:僅僅有當INSTALLED_APPS包括'django.contrib.auth'時,pythonmanage.py createsuperuser這個命令才可用。
4. 將admin訪問配置在URLconf(urls.py). 默認情況下,命令django-admin.pystartproject生成的文件urls.py是將Django admin的路徑凝視掉的。 取消凝視。
# Include these import statements...
from django.contrib import admin
admin.autodiscover()
# And include this URLpattern...
urlpatterns = patterns('',
# ...
(r'^admin/', include(admin.site.urls)),
# ...
)
使用管理工具
執行Django管理工具
啟動開發服務器(python manage.py runserver)。然后在瀏覽器中訪問:http://127.0.0.1:8000/admin/
登錄管理界面

使用你原來設置的超級用戶的username和password。
Note:
1. 假設無法登錄。請執行`` python manage.py createsuperuser`` 。確保你已經創建了一個超級用戶。
2. 假設看到例如以下所看到的的錯誤頁面報告:ImportError at /admin/cannot import name patterns...非常可能使用的 Django 版本號不符合,能夠切換到相應的舊版本號教程去或者更新到較新的 Django 版本號。
管理頁面

Note:
1. 這個頁面列出了管理工具中可編輯的全部數據類型。 它僅有兩個默認的管理-編輯模塊:用戶組(Groups)和用戶(Users)。
2. 界面上並沒有顯示之前創建的數據表。由於我們的這個表沒有在admin.py中注冊,也就是admin后台並不知道。后面會講怎么加入/注冊 -- 將Models加入到Admin管理。
3. 在Django管理頁面中,每一種數據類型都有一個* change list* 和* editform* 。前者顯示數據庫中全部的可用對象;后者可讓你加入、更改和刪除數據庫中的某條記錄。
配置Django管理工具語言
假設你的母語不是英語。而你不想用它來配置你的瀏覽器,你能夠做一個高速更改來觀察Django管理工具是否被翻譯成你想要的語言。
僅需加入`` ‘django.middleware.locale.LocaleMiddleware’`` 到`` MIDDLEWARE_CLASSES`` 設置中,並確保它在’django.contrib.sessions.middleware.SessionMiddleware’* 之后* 。
完畢后。請刷新頁面。 假設你設置的語言可用,一系列的鏈接文字將被顯示成這樣的語言。這些文字包含頁面頂端的Changepassword和Log out,頁面中部的Groups和Users。 Django自帶了多種語言的翻譯。[Django很多其它的國際化特性]
更改列表
點擊Uers行中的Change鏈接。這個頁面顯示了數據庫中全部的用戶。
能夠將它看作是一個美麗的網頁版查詢:`` SELECT * FROM auth_user;`` 。你會發現頁面中還有過濾器、排序和查詢框。 過濾器在右邊。排序功能可通過點擊列頭查看;查詢框在頁面頂部。它同意你通過username查詢。
點擊當中一個username。你會看見關於這個用戶的編輯窗體。
Note:
1. 這個頁面同意你改動用戶的屬性,如姓名和權限。
(假設要更改用戶password,你必須點擊password字段下的change the password using this form)
2. 不同類型的字段會用不同的窗體控件顯示。
比如,日期/時間型用日歷控件,布爾型用復選框。字符型用簡單文本框顯示。
你會見到一個確認頁面。有時候,它會顯示有哪些關聯的對象將會一並被刪除。 (比如,假設你要刪除一個出版社。它以下全部的圖書也將被刪除。
)
4. 你能夠通過點擊管理主頁面中某個對象的Add來加入一條新記錄。 一個空白記錄的頁面將被打開,等待你填充。
5. 你還能看到管理界面也控制着你輸入的有效性。 你能夠試試不填必需的欄目或者在時間欄里填錯誤的時間,你會發現當你要保存時會出現錯誤信息。
6. 當你編輯已有的對像時,你在窗體的右上角能夠看到一個歷史button。 通過管理界面做的每個改變都留有記錄。你能夠按歷史鍵來檢查這個記錄。將Models增加到Admin管理
將自己的模塊加入管理工具中。這樣我們就行通過這個美麗的界面加入、改動和刪除數據庫中的對象了。之前我們定義了三個模塊:Publisher 、Author 和Book 。
在mysite/books/創建admin.py。輸入下面代碼,通知管理工具為這些模塊逐一提供界面。
from django.contrib import admin from VoteSite.books.models import Publisher, Author, Book # Register your models here. admin.site.register(Publisher) admin.site.register(Author) admin.site.register(Book)完畢后。打開頁面`` http://127.0.0.1:8000/admin/`` ,你會看到一個Books區域。當中包括Authors、Books和Publishers。 (你可能須要重新啟動runserver)
Note:這里有個奇妙的bug:改動后Djangoserver會報錯,但python文件里不報錯,把 fromVoteSite.books.models importPublisher, Author, Book改動為 frombooks.models importPublisher, Author, Book后Django服務器不報錯,但python文件里會顯示錯誤,僅僅是這個錯誤沒影響- -,runserver成功!
修正方法:pycharm > settings > languages & framworks > Django > pythonworkspace > Enable Django Support: Django project root:E:\mine\python_workspace\VoteSite settings: VoteSite\settings.py > OK。
這樣做是為了告訴python這是一個Django項目。
(跳跳亂說,不能解決)
管理工具處理外鍵和多對多關系的方法
`` Book`` 模塊的樣例:
class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField()
在Add book頁面中(`` http://127.0.0.1:8000/admin/books/book/add/`` )。`` 外鍵`` publisher用一個選擇框顯示,`` 多對多`` 字段author用一個多選框顯示。 點擊兩個字段后面的綠色加號,能夠讓你加入相關的記錄。
舉個樣例,假設你點擊Publisher后面的加號。你將會得到一個彈出窗體來加入一個publisher。 當你在那個窗體中成功創建了一個publisher后。Add book表單會自己主動把它更新到字段上去.
http://blog.csdn.net/pipisorry/article/details/45079751
自己定義管理工具-自己定義模塊
Note:記住這三步來實現模型的變更(否則在日期型和數字型字段設置時保存信息到數據庫會成功。但會顯示錯誤)[Django項目實踐3 - Django模型]
- 修改你的模型(在models.py中)。
- 執行python manage.py makemigrations命令為這些修改創建遷移文件。
- 執行python manage.py migrate命令將這些修改應用到數據庫中。
管理工具有個限制:編輯表單須要你填寫每個字段。然而在有些情況下,你想要某些字段是可選的,即同意不填,同意輸入空值。
為了指定email字段為可選,你僅僅要編輯Book模塊,在email字段上加上blank=True。代碼例如以下:
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True)
這些代碼告訴Django,作者的郵箱地址同意輸入一個空值。 全部字段都默認blank=False。這使得它們不。
當你加入blank=True以后,刷新頁面Add author edit form(http://127.0.0.1:8000/admin/books/author/add/ )。將會發現Email的標簽不再是粗體了。
Note:blank=True就是說默認值是‘’。而不是NULL。由於從以下可知,Django生成CREATETABLE語句自己主動為每一個字段顯式加上NOT NULL。
設置日期型和數字型字段可選(還有ImageField等)
盡管blank=True相同適用於日期型和數字型字段。可是這里須要具體解說一些背景知識。
SQL有指定空值的獨特方式,它把空值叫做NULL。NULL能夠表示為未知的、非法的、或其他程序指定的含義。
在SQL中,NULL的值不同於空字符串,就像Python中None不同於空字符串("")一樣。這意味着某個字符型字段(如VARCHAR)的值不可能同一時候包括NULL和空字符串。
這會引起不必要的歧義或疑惑。 為什么這條記錄有個NULL。而那條記錄卻有個空字符串? 如何才干得到所有擁有空值的記錄,應該按NULL和空字符串查找還是僅按字符串查找?
為了消除歧義,Django生成CREATETABLE語句自己主動為每一個字段顯式加上NOT NULL。
生成Author模塊的樣例:
CREATE TABLE "books_author" (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(40) NOT NULL,
"email" varchar(75) NOT NULL
);
數據一致性:在管理工具中,假設你留空一個字符型字段,它會為此插入一個空字符串(而不是NULL)。
可是,日期型、時間型和數字型字段不接受空字符串,可能會得到數據庫返回的錯誤。 (PostgreSQL比較嚴禁,會拋出一個異常;MySQL可能會也可能不會接受。
)
在這樣的情況下,NULL是唯一指定空值的方法。 因此。假設你想同意一個日期型(DateField、TimeField、DateTimeField)或數字型(IntegerField、DecimalField、FloatField)字段為空,你須要使用null=True 和blank=True。
class Book(models.Model): ''' 書籍有書名和出版日期 ''' title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField(blank=True, null=True) def __str__(self): return self.title
由於null=True改變了數據的語義。即改變了CREATETABLE語句,把publication_date字段上的NOTNULL刪除了。
要完畢這些修改,我們還須要更新數據庫。
出於某種原因,Django不會嘗試自己主動更新數據庫結構。所以你必須運行ALTERTABLE語句將模塊的修改更新至數據庫。
能夠使用python manage.py dbshell進入數據庫服務環境。
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
以上SQL語法是PostgreSQL特有的。
自己定義字段標簽在編輯頁面中,每一個字段的標簽都是從模塊的字段名稱生成的。 規則非常easy: 用空格替換下划線;首字母大寫。比如:Book模塊中publication_date的標簽是Publication date。
自己定義一個標簽。 你僅僅需在模塊中指定verbose_name。
將Author.email的標簽改為e-mail:
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, verbose_name='e-mail')
改動后重新啟動server,你會在author編輯頁面中看到這個新標簽。
Note:不必把verbose_name的首字母大寫,Django會自己主動適時將首字母大寫,而且在其他不須要大寫的地方使用verbose_name的精確值。
django后台設置可動態增刪的add字段
{實現如工作經歷隨時增刪}
class WorkExp(models.Model): work_experience = models.TextField(verbose_name='工作經歷')
class People(models.Model): name = models.CharField(max_length=150, verbose_name='姓名') #...這樣就能夠在后台隨時點擊add。在彈出框中添加工作經歷work_experiences = models.ManyToManyField(WorkExp, blank=True, null=True, verbose_name='工作經歷')

Note:在表WorkExp未建立前,后面的+符號是沒有的,所以要確保表WorkExp已建立。
自己定義ModelAdmin類-自己定義管理工具
我們做的blank=True、null=True和verbose_name改動事實上是模塊級別。而不是管理級別的。 也就是說。這些改動實質上是構成模塊的一部分,而且正好被管理工具使用。而不是專門針對管理工具的。
自己定義管理工具選項都在ModelAdmin classes里面,這些類包括了管理工具中針對特別模塊的配置。
自己定義顯示字段
{自己定義Author模塊的列表中的顯示字段 - Select *** to change界面}
列表默認地顯示查詢結果中對象的__unicode__()。
class Author(models.Model): ''' 作者有姓。有名及email地址 ''' first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField(blank=True, verbose_name='e-mail') def __str__(self): return u'%s %s' % (self.first_name, self.last_name)
列表中顯示的是每一個作者的姓名。
比方說:在這個列表中能夠看到作者的郵箱地址;能依照姓氏或名字來排序。
為Author模塊定義一個ModelAdmin類。
這個類是自己定義管理工具的關鍵,當中最主要的一件事情是同意你指定列表中的字段。
打開admin.py並改動:
from django.contrib import admin from books.models import Publisher, Author, Book class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'email') # Register your models here. admin.site.register(Publisher) # admin.site.register(Author) admin.site.register(Author, AuthorAdmin) admin.site.register(Book)
Note:
1. 新建類AuthorAdmin。從django.contrib.admin.ModelAdmin派生出來的子類。保存着一個類的自己定義配置,以供管理工具使用。
我們僅僅自己定義了一項:list_display, 它是一個字段名稱的元組。用於列表顯示。
當然。這些字段名稱必須是模塊中有的。
2. 我們改動了admin.site.register()調用,在Author后面加入了AuthorAdmin: 用AuthorAdmin選項注冊Author模塊。admin.site.register()函數接受一個ModelAdmin子類作為第二個參數。
3. the value of list_display must not be a manyToManyField! 如BookAdmin中的list_display不能有authors。
刷新author列表頁面

加入一個高速查詢欄
{Select *** to change界面}
向AuthorAdmin追加search_fields。如:
class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'email') search_fields = ('first_name', 'last_name')
刷新瀏覽器。你會在頁面頂端看到一個依據姓名查詢的查詢框。正如用戶所希望的那樣。它是大寫和小寫敏感,而且對兩個字段檢索的查詢框。假設查詢"bar",那么名字中含有Barney和姓氏中含有Hobarson的作者記錄將被檢索出來。
加入過濾器
{Select *** to change界面}
from django.contrib import admin from books.models import Publisher, Author, Book class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'email') search_fields = ('first_name', 'last_name') class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publisher_date',) # Register your models here. admin.site.register(Publisher) # admin.site.register(Author) admin.site.register(Author, AuthorAdmin) admin.site.register(Book, BookAdmin)
Note:
1. 因為我們要處理一系列選項。因此我們創建了一個單獨的ModelAdmin類:BookAdmin。
2. 首先,我們定義一個list_display,以使得頁面好看些。 然后。我們用list_filter這個字段元組創建過濾器,它位於列表頁面的右邊。
3. Django為日期型字段提供了快捷過濾方式,它包括:今天、過往七天、當月和今年。這些是開發者經經常使用到的。
`` 過濾器`` 相同適用於其他類型的字段
不單是`` 日期型`` (`` 布爾型`` 和`` 外鍵`` 字段)。
當有兩個以上值時,過濾器就會顯示。
第二種過濾日期的方式是使用date_hierarchy選項。如:
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',) **date_hierarchy = 'publication_date'**
改動后頁面中的列表頂端會有一個逐層深入的導航條,效果如圖 6-11. 它從可用的年份開始,然后逐層細分到月乃至日。
Note:date_hierarchy接受的是* 字符串* ,而不是元組。
由於僅僅能對一個日期型字段進行層次划分。
改變默認的排序方式
按publication date降序排列。 列表頁面默認依照模塊classMeta中的ordering所指的列排序。但眼下沒有指定ordering值。所以當前排序是未定義的。
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
**ordering = ('-publication_date',)**
Note:這個ordering選項基本像模塊中classMeta的ordering那樣工作。除了它僅僅用列表中的第一個字段名。
假設要實現降序,僅需在傳入的列表或元組的字段前加上一個減號(-)。
刷新book列表頁面觀看實際效果。 注意Publicationdate列頭如今有一個小箭頭顯示排序。
自己定義編輯表單
先自己定義字段順序。 默認地,表單中的字段順序是與模塊中定義是一致的。通過使用 ModelAdmin子類中的 fields選項來改變它:
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',) date_hierarchy = 'publication_date' ordering = ('-publication_date',) **fields = ('title', 'authors', 'publisher', 'publication_date')**
完畢之后。編輯表單將依照指定的順序顯示各字段。 作者排在書名之后。 字段順序當然是與數據條文件夾入順序有關, 每一個表單都不一樣。
通過fields這個選項,你能夠排除一些不想被其它人編輯的fields 僅僅要不選上不想被編輯的field(s)就可以。 當你的admi用戶僅僅是被信任能夠更改你的某一部分數據時,或者。你的數據被一些外部的程序自己主動處理而改變了了,你就能夠用這個功能。
比如,在book數據庫中,我們能夠隱藏publication_date,以防止它被編輯。
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',) date_hierarchy = 'publication_date' ordering = ('-publication_date',) **fields = ('title', 'authors', 'publisher')**
Note:1. 上圖中就沒有改動publication日期的選項了。
2. 當一個用戶用這個不包括完整信息的表單加入一本新書時,Django會簡單地將publication_date設置為None,以確保這個字段滿足null=True的條件。
還有一個經常使用的編輯頁面自己定義是針對多對多字段的。 真如我們在book編輯頁面看到的那樣,`` 多對多字段`` 被展現成多選框。
盡管多選框在邏輯上是最適合的HTML控件,但它卻不那么好用。 假設你想選擇多項,你必須還要按下Ctrl鍵(蘋果機是command鍵)。 盡管管理工具因此加入了凝視(help_text)。可是當它有幾百個選項時,它依舊顯得笨拙。
使用filter_horizontal
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',) date_hierarchy = 'publication_date' ordering = ('-publication_date',) **filter_horizontal = ('authors',)**
刷新book編輯頁面。你會看到Author區中有一個靜止的JavaScript過濾器。它同意你檢索選項。然后將選中的authors從Available框移到Chosen框,還能夠移回來。

強烈建議針對那些擁有十個以上選項的`` 多對多字段`` 使用filter_horizontal。
這比多選框好用多了。 你能夠在多個字段上使用filter_horizontal,僅僅需在這個元組中指定每一個字段的名字。
ModelAdmin類還支持filter_vertical選項
它像filter_horizontal那樣工作,除了控件都是垂直排列。而不是水平排列的。 至於使用哪個,僅僅是個人喜好問題。
Note:filter_horizontal和filter_vertical選項僅僅能用在多對多字段 上, 而不能用於ForeignKey字段。
raw_id_fields選項
默認地,管理工具使用`` 下拉框`` 來展現`` 外鍵`` 字段。
可是。正如`` 多對多字段`` 那樣,有時候你不想忍受因裝載並顯示這些選項而產生的大量開銷。
比如,我們的book數據庫膨脹到擁有數千條publishers的記錄,以致於book的加入頁面裝載時間較久,由於它必須把每個publishe都裝載並顯示在`` 下拉框`` 中。
解決問題的辦法是使用`` raw_id_fields`` 選項。
它是一個包括外鍵字段名稱的元組,它包括的字段將被展現成`` 文本框`` 。而不再是`` 下拉框`` 。
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',) date_hierarchy = 'publication_date' ordering = ('-publication_date',) filter_horizontal = ('authors',) **raw_id_fields = ('publisher',)**在這個輸入框中,你輸入什么呢? publisher的數據庫ID號。
考慮到人們通常不會記住這些數據庫ID,管理工具提供了一個放大鏡圖標方便你輸入。點擊那個圖標將會彈出一個窗體,在那里你能夠選擇想要加入的publishe。
關聯對象inline
models:class Professor(People): job_title = models.CharField(max_length=150, blank=True, verbose_name='職稱') class ResDir(models.Model): research_direction = models.TextField(blank=True, verbose_name='研究方向') professor = models.ForeignKey(Professor) # postgraduate = models.ForeignKey(Postgraduate)admin.py:
class inlineBase(admin.TabularInline): extra = 1 class ResDirInline(inlineBase): # 要重新啟動runserver model = ResDir class ProfessorAdmin(admin.ModelAdmin): inlines = [ResDirInline, ][Django admin site(三)InlineModelAdmin]
嵌套關聯對象nested inline
安裝django-nested-inline
pip install django-nested-inline
使用
settings.py中的INSTALLED_APPS中加入nested_inline
INSTALLED_APPS = ( ... 'nested_inline' )
Note:否則會出現找不到tabular-nested.html模板錯誤:
TemplateDoesNotExist at /admin/bigdata/lab/add/
admin/edit_inline/tabular-nested.html
# 實驗室相關信息 class Lab(models.Model): introduction = models.TextField(null=True) achievement = models.TextField(null=True) class Directions(models.Model): research_direction = models.TextField(blank=True, verbose_name='研究方向') lab = models.ForeignKey(Lab) class Images(models.Model): images = models.ImageField(blank=True, verbose_name='圖片') directions = models.ForeignKey(Directions)
class ImagesInline(NestedInlineBase): model = Images class DirectionsInline(NestedInlineBase): model = Directions inlines = [ImagesInline] class LabAdmin(NestedModelAdmin): inlines = [DirectionsInline] admin.site.register(Lab, LabAdmin)

[ django-nested-inline 0.3.4]
[ Nested Inline in Django Admin]
[ Django Admin nested inline]
用戶、用戶組和權限
由於你是用超級用戶登錄的,你能夠創建,編輯和刪除不論什么對像。
管理工具有一個用戶權限系統,通過它你能夠依據用戶的須要來指定他們的權限,從而達到部分訪問系統的目的。用戶帳號應該是通用的、獨立於管理界面以外仍能夠使用。
但我們如今把它看作是管理界面的一部分。 [怎樣把用戶帳號與你的站點(不不過管理工具)集成在一起]
首先。這有 一組三個布爾型標記:
-
活動標志。它用來控制用戶是否已經激活。 假設一個用戶帳號的這個標記是關閉狀態,而用戶又嘗試用它登錄時,即使password正確,他也無法登錄系統。
-
成員標志,它用來控制這個用戶能否夠登錄管理界面(即:這個用戶是不是你們組織里的成員) 因為用戶系統能夠被用於控制公眾頁面(即:非管理頁面)的訪問權限。這個標志可用來區分公眾用戶和管理用戶。
-
超級用戶標志。它賦予用戶在管理界面中加入、改動和刪除不論什么項目的權限。
假設一個用戶帳號有這個標志,那么全部權限設置(即使沒有)都會被忽略。
普通的活躍、非超級用戶的管理用戶能夠依據一套設定好的許可進入。
管理界面中每種可編輯的對象(如:books)都有三種權限:創建 許可。編輯 許可和刪除 許可。 給一個用戶授權許可也就表明該用戶能夠進行許可描寫敘述的操作。
當你創建一個用戶時。它沒有不論什么權限,該有什么權限是由你決定的。 比如,你能夠給一個用戶加入和改動publishers的權限,而不給他刪除的權限。 請注意。這些權限是定義在模塊級別上,而不是對象級別上的。這樣的基於對象級別的權限設置比較復雜。能夠在Django documentation中尋找答案。
Note:權限管理系統也控制編輯用戶和權限。 假設你給某人編輯用戶的權限,他能夠編輯自己的權限,這樣的能力可能不是你希望的。 賦予一個用戶改動用戶的權限。本質上說就是把他變成一個超級用戶。
你也能夠給組中分配用戶。
一個 組 簡化了給組中全部成員應用一套許可的動作。 組在給大量用戶特定權限的時候非常實用。
何時、為什么使用管理界面?
Django的管理界面對非技術用戶要輸入他們的數據時特別實用;其實這個特性就是專門為這個 實現的。
在Django最開始開發的新聞報道的行業應用中,有一個典型的在線自來水的水質專題報道 應用,它的實現流程是這種:
-
負責這個報道的記者和要處理數據的開發人員碰頭。提供一些數據給開發人員。
-
開發人員環繞這些數據設計模型然后配置一個管理界面給記者。
-
記者檢查管理界面,盡早指出缺少或多余的字段。 開發人員來回地改動模塊。
-
當模塊認可后,記者就開始用管理界面輸入數據。 同一時候,程序猿能夠專注於開發公眾訪問視圖和模板(有趣的部分)。
換句話說,Django的管理界面為內容輸入人員和編程人員都提供了便利的工具。
除了數據輸入方面,管理界面在以下這些情景中也是非常實用的:
1. 檢查模塊* :當你定義好了若干個模塊。在管理頁面中把他們調出來然后輸入一些虛假的數據,這是相當實用的。 有時候,它能顯示數據建模的錯誤或者模塊中其他問題。
2. 管理既得數據* :假設你的應用程序依賴外部數據(來自用戶輸入或網絡爬蟲)。管理界面提供了一個便捷的途徑。讓你檢查和編輯那些數據。
你能夠把它看作是一個功能不那么強大,可是非常方便的數據庫命令行工具。
3. 暫時的數據管理程序* :你能夠用管理工具建立自己的輕量級數據管理程序,比方說開銷記錄。 假設你正在依據自己的,而不是公眾的須要開發些什么。那么管理界面能夠帶給你非常大的幫助。 從這個意義上講,你能夠把它看作是一個增強的關系型電子表格。
最后一點要澄清的是: 管理界面不是終結者。 過往很多年間,我們看到它被拆分、改動成若干個功能模塊。而這些功能不是它所支持的。它不應成為一個* 公眾* 數據訪問接口,也不應同意對你的數據進行復雜的排序和查詢。 正如本章開頭所說。它僅提供給可信任的管理員。
請記住這一點,它是有效使用管理界面的鑰匙。
from:http://blog.csdn.net/pipisorry/article/details/45079751