Admin站點
內容發布的部分由網站的管理員負責查看、添加、修改、刪除數據,開發這些重復的功能是一件單調乏味、缺乏創造力的工作,為此,Django能夠根據定義的模型類自動地生成管理模塊。
說明:案例以地區數據舉例
1)准備工作:創建管理員的用戶名和密碼。
python manage.py createsuperuser 按提示填寫用戶名、郵箱、密碼。
2)使用:在應用的admin.py中注冊模型類
例:打開booktest/admin.py文件,注冊地區模型。
from django.contrib import admin from models import * admin.site.register(AreaInfo)
3)輸入如下網址:
http://127.0.0.1:8000/admin/
按提示填寫用戶名、密碼,點擊“Log in”按鈕登錄
登錄成功后,可以看到AreaInfos,可以進行增加、修改、刪除、查詢的管理。
控制管理頁展示
類ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表頁的展示方式、添加修改頁的展示方式。
1)在booktest/admin.py中,注冊模型類前定義管理類AreaAdmin。
class AreaAdmin(admin.ModelAdmin): pass
管理類有兩種使用方式:
- 注冊參數
- 裝飾器
注冊參數:打開booktest/admin.py文件,注冊模型類代碼如下:
admin.site.register(AreaInfo,AreaAdmin)
裝飾器:打開booktest/admin.py文件,在管理類上注冊模型類,代碼如下:
@admin.register(AreaInfo) class AreaAdmin(admin.ModelAdmin): pass
列表頁選項
頁大小
每頁中顯示多少條數據,默認為每頁顯示100條數據,屬性如下:
list_per_page=100
1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): list_per_page = 10
"操作選項"的位置
頂部顯示的屬性,設置為True在頂部顯示,設置為False不在頂部顯示,默認為True。
actions_on_top=True
底部顯示的屬性,設置為True在底部顯示,設置為False不在底部顯示,默認為False。
actions_on_bottom=False
1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... actions_on_top = True actions_on_bottom = True
列表中的列
屬性如下:
list_display=[模型字段1,模型字段2,...]
1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... list_display = ['id','atitle']
點擊列頭可以進行升序或降序排列。
將方法作為列
列可以是模型字段,還可以是模型方法,要求方法有返回值。
1)打開booktest/models.py文件,修改AreaInfo類如下:
class AreaInfo(models.Model): ... def title(self): return self.atitle
2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... list_display = ['id','atitle','title']
方法列是不能排序的,如果需要排序需要為方法指定排序依據。(點擊列標題可排序)
admin_order_field=模型類字段
1)打開booktest/models.py文件,修改AreaInfo類如下:
class AreaInfo(models.Model): ... def title(self): return self.atitle title.admin_order_field='atitle'
列標題
列標題默認為屬性或方法的名稱,可以通過屬性設置。需要先將模型字段封裝成方法,再對方法使用這個屬性,模型字段不能直接使用這個屬性。
short_description='列標題'
1)打開booktest/models.py文件,修改AreaInfo類如下:
class AreaInfo(models.Model):
def title(self):
return self.atitle
title.short_description='區域名稱'
關聯對象
無法直接訪問關聯對象的屬性或方法,可以在模型類中封裝方法,訪問關聯對象的成員。
1)打開booktest/models.py文件,修改AreaInfo類如下:
def parent(self): # 需要判斷是否有上級地區,省的上級地區為空 if self.aparent: return self.aparent.atitle return 'None'
2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... list_display = ['id','atitle','title','parent']
右側欄過濾器
屬性如下,只能接收字段,會將對應字段的值列出來,用於快速過濾。一般用於有重復值的字段。
list_filter=[]
1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... list_filter=['atitle']
搜索框
屬性如下,用於對指定字段的值進行搜索,支持模糊查詢。列表類型,表示在這些字段上進行搜索。
search_fields=[]
1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... search_fields=['atitle']
中文標題
1)打開booktest/models.py文件,修改模型類,為屬性指定verbose_name參數,即第一個參數。
class AreaInfo(models.Model): atitle=models.CharField(verbose_name='標題',max_length=30)#名稱 ...
編輯頁選項
顯示字段順序(通過以下的射值可以改變編輯頁順序顯示的順序)
屬性如下:
fields=[]
2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... fields=['aParent','atitle']
修改編輯頁對象的顯示名稱
在下拉列表中輸出的是對象的名稱,可以在模型類中定義str方法用於對象轉換字符串。
1)打開booktest/models.py文件,修改AreaInfo類,添加str方法。
class AreaInfo(models.Model): ... def __str__(self): return self.atitle.encode('utf-8')
分組顯示
注意:這項和fields只能出現一個,互斥的
屬性如下:
fieldset=( ('組1標題',{'fields':('字段1','字段2')}), ('組2標題',{'fields':('字段3','字段4')}), )
1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... # fields=['aParent','atitle'] fieldsets = ( ('基本', {'fields': ['atitle']}), ('高級', {'fields': ['aParent']}) )
說明:fields與fieldsets兩者選一使用。
關聯對象
在一對多的關系中,可以在一端的編輯頁面中編輯多端的對象,嵌入多端對象的方式包括表格、塊兩種。 類型InlineModelAdmin:表示在模型的編輯頁面嵌入關聯模型的編輯。子類TabularInline:以表格的形式嵌入。
子類StackedInline:以塊的形式嵌入。
1)打開booktest/admin.py文件,創建AreaStackedInline類。
class AreaStackedInline(admin.StackedInline): model = AreaInfo#關聯子對象 extra = 2#額外編輯2個子對象
2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... inlines = [AreaStackedInline]
可以用表格的形式嵌入。
1)打開booktest/admin.py文件,創建AreaTabularInline類。
class AreaTabularInline(admin.TabularInline): model = AreaInfo#關聯子對象 extra = 2#額外編輯2個子對象
2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... inlines = [AreaTabularInline]
重寫模板
1)在templates/目錄下創建admin目錄
2)打開當前虛擬環境中Django的目錄,再向下找到admin的模板,目錄如下:
/home/python/.virtualenvs/py_django/lib/python2.7/site-packages/django/contrib/admin/templates/admin
3)將需要更改文件拷貝到(在項目的templates文件夾里面創建admin文件夾)里,此處以base_site.html為例。

{% extends "admin/base.html" %} {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} {% block branding %} <h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1> <hr> <h1>自定義的管理頁模板</h1> <hr> {% endblock %} {% block nav-global %}{% endblock %}
4)即可看到效果
其它后台的模板可以按照相同的方式進行修改。
上傳圖片
創建包含圖片的模型類
將模型類的屬性定義成models.ImageField類型。
1)打開booktest/models.py文件,定義模型類PicTest。
class PicTest(models.Model): pic = models.ImageField(upload_to='booktest/')
2)回到命令行中,生成遷移。
python manage.py makemigrations
3)回到命令行中,執行遷移。
python manage.py migrate
4)打開test5/settings.py文件,設置圖片保存路徑。因為圖片也屬於靜態文件,所以保存到static目錄下。
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
5)在static目錄下創建media目錄,再創建應用名稱的目錄,此例為booktest
在管理頁面admin中上傳圖片
1)打開booktest/admin.py文件,注冊PicTest。
from django.contrib import admin from models import * admin.site.register(PicTest)
2)運行服務器,輸入如下網址。
http://127.0.0.1:8000/admin/
3)點擊“Add”添加數據,打開新頁面。
4)選擇圖片,點擊“save”按鈕完成圖片上傳。
5)回到數據庫命令行,查詢即可
6)圖片被保存到目錄static/media/booktest/下
5)回到數據庫命令行,查詢即可
6)圖片被保存到目錄static/media/booktest/下