Django項目實踐4 - Django網站管理(后台管理員)


http://blog.csdn.net/pipisorry/article/details/45079751

上篇:Django項目實踐3 - Django模型

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. 不同類型的字段會用不同的窗體控件顯示。

比如,日期/時間型用日歷控件,布爾型用復選框。字符型用簡單文本框顯示。


3. 你能夠通過點擊編輯頁面下方的刪除button來刪除一條記錄。

你會見到一個確認頁面。有時候,它會顯示有哪些關聯的對象將會一並被刪除。 (比如,假設你要刪除一個出版社。它以下全部的圖書也將被刪除。

4. 你能夠通過點擊管理主頁面中某個對象的Add來加入一條新記錄。 一個空白記錄的頁面將被打開,等待你填充。

5. 你還能看到管理界面也控制着你輸入的有效性。 你能夠試試不填必需的欄目或者在時間欄里填錯誤的時間,你會發現當你要保存時會出現錯誤信息。

6. 當你編輯已有的對像時,你在窗體的右上角能夠看到一個歷史button。 通過管理界面做的每個改變都留有記錄。你能夠按歷史鍵來檢查這個記錄。
將Models增加到Admin管理

將自己的模塊加入管理工具中。這樣我們就行通過這個美麗的界面加入、改動和刪除數據庫中的對象了。之前我們定義了三個模塊:PublisherAuthorBook

在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是唯一指定空值的方法。 因此。假設你想同意一個日期型(DateFieldTimeFieldDateTimeField)或數字型(IntegerFieldDecimalFieldFloatField)字段為空,你須要使用null=Trueblank=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進入數據庫服務環境。

[Mysql數據庫安裝及配置]

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='姓名')
    #...
    work_experiences = models.ManyToManyField(WorkExp, blank=True, null=True, verbose_name='工作經歷')
這樣就能夠在后台隨時點擊add。在彈出框中添加工作經歷

Note:在表WorkExp未建立前,后面的+符號是沒有的,所以要確保表WorkExp已建立。



自己定義ModelAdmin類-自己定義管理工具

我們做的blank=Truenull=Trueverbose_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選項基本像模塊中classMetaordering那樣工作。除了它僅僅用列表中的第一個字段名。

假設要實現降序,僅需在傳入的列表或元組的字段前加上一個減號(-)。

刷新book列表頁面觀看實際效果。 注意Publicationdate列頭如今有一個小箭頭顯示排序。


自己定義編輯表單

{change *** 編輯界面}
先自己定義字段順序。 默認地,表單中的字段順序是與模塊中定義是一致的。通過使用 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_horizontalfilter_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]



用戶、用戶組和權限

由於你是用超級用戶登錄的,你能夠創建,編輯和刪除不論什么對像。

管理工具有一個用戶權限系統,通過它你能夠依據用戶的須要來指定他們的權限,從而達到部分訪問系統的目的。用戶帳號應該是通用的、獨立於管理界面以外仍能夠使用。

但我們如今把它看作是管理界面的一部分。 [怎樣把用戶帳號與你的站點(不不過管理工具)集成在一起]

你通過管理界面編輯用戶及其許可就像你編輯別的對象一樣。  如你所想。用戶對象有標准的username、password、郵箱地址和真實姓名。同一時候它還有關於使用管理界面的權限定義。
首先。這有 一組三個布爾型標記:
  • 活動標志。它用來控制用戶是否已經激活。 假設一個用戶帳號的這個標記是關閉狀態,而用戶又嘗試用它登錄時,即使password正確,他也無法登錄系統。

  • 成員標志,它用來控制這個用戶能否夠登錄管理界面(即:這個用戶是不是你們組織里的成員) 因為用戶系統能夠被用於控制公眾頁面(即:非管理頁面)的訪問權限。這個標志可用來區分公眾用戶和管理用戶。

  • 超級用戶標志。它賦予用戶在管理界面中加入、改動和刪除不論什么項目的權限。

    假設一個用戶帳號有這個標志,那么全部權限設置(即使沒有)都會被忽略。

普通的活躍、非超級用戶的管理用戶能夠依據一套設定好的許可進入。


管理界面中每種可編輯的對象(如:books)都有三種權限:創建 許可。編輯 許可和刪除 許可。 給一個用戶授權許可也就表明該用戶能夠進行許可描寫敘述的操作。

當你創建一個用戶時。它沒有不論什么權限,該有什么權限是由你決定的。 比如,你能夠給一個用戶加入和改動publishers的權限,而不給他刪除的權限。 請注意。這些權限是定義在模塊級別上,而不是對象級別上的。這樣的基於對象級別的權限設置比較復雜。能夠在Django documentation中尋找答案。

Note:權限管理系統也控制編輯用戶和權限。 假設你給某人編輯用戶的權限,他能夠編輯自己的權限,這樣的能力可能不是你希望的。 賦予一個用戶改動用戶的權限。本質上說就是把他變成一個超級用戶。

你也能夠給組中分配用戶。

一個 組 簡化了給組中全部成員應用一套許可的動作。 組在給大量用戶特定權限的時候非常實用。


何時、為什么使用管理界面?

Django的管理界面對非技術用戶要輸入他們的數據時特別實用;其實這個特性就是專門為這個 實現的。

在Django最開始開發的新聞報道的行業應用中,有一個典型的在線自來水的水質專題報道 應用,它的實現流程是這種:

  • 負責這個報道的記者和要處理數據的開發人員碰頭。提供一些數據給開發人員。

  • 開發人員環繞這些數據設計模型然后配置一個管理界面給記者。

  • 記者檢查管理界面,盡早指出缺少或多余的字段。 開發人員來回地改動模塊。

  • 當模塊認可后,記者就開始用管理界面輸入數據。 同一時候,程序猿能夠專注於開發公眾訪問視圖和模板(有趣的部分)。

換句話說,Django的管理界面為內容輸入人員和編程人員都提供了便利的工具。

除了數據輸入方面,管理界面在以下這些情景中也是非常實用的:

1. 檢查模塊* :當你定義好了若干個模塊。在管理頁面中把他們調出來然后輸入一些虛假的數據,這是相當實用的。 有時候,它能顯示數據建模的錯誤或者模塊中其他問題。

2. 管理既得數據* :假設你的應用程序依賴外部數據(來自用戶輸入或網絡爬蟲)。管理界面提供了一個便捷的途徑。讓你檢查和編輯那些數據。

你能夠把它看作是一個功能不那么強大,可是非常方便的數據庫命令行工具。

3. 暫時的數據管理程序* :你能夠用管理工具建立自己的輕量級數據管理程序,比方說開銷記錄。 假設你正在依據自己的,而不是公眾的須要開發些什么。那么管理界面能夠帶給你非常大的幫助。 從這個意義上講,你能夠把它看作是一個增強的關系型電子表格。

最后一點要澄清的是: 管理界面不是終結者。 過往很多年間,我們看到它被拆分、改動成若干個功能模塊。而這些功能不是它所支持的。

它不應成為一個* 公眾* 數據訪問接口,也不應同意對你的數據進行復雜的排序和查詢。 正如本章開頭所說。它僅提供給可信任的管理員。

請記住這一點,它是有效使用管理界面的鑰匙。

from:http://blog.csdn.net/pipisorry/article/details/45079751



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM