Django 有著強大而又及其易用的admin后臺,在這里,你可以輕松實現復雜代碼實現的功能,如搜索,篩選,分頁,題目可編輯,多選框.
簡單到,一行代碼就可以實現一個功能,而且模塊之間耦合得相當完美.
不信,一起來看看吧!?用Django實現管理書籍的系統,并能在前臺界面對書籍進行增刪查改,篩選,分頁,以及批量查詢修改功能.
準備工作
1
|
#準備好你的數據庫模型思維導圖 |
0.新建一個Django項目,起名為books,并且同時新建一個應用book11
1.首先要設置models模塊,根據思維導圖,我們知道需要定義3張表,分別是Book,Author,Publisher.
1.1然而,django強大的地方在于,你無需在數據庫開辟一張表,ORM的模型,讓你只需要關注你要操作的對象.這里用類對象,來替代表,從而使得定義一張數據表Book,就只需要簡單的創建Book類對象,即可
1
2
3
4
5
6
7
8
|
#先設計作者Author對象(表)[models.py] ? class Author(models.Model): #繼承于models.Model這個父類,從而實現多態 first_name = models.CharField(max_length = 32 ) #名字的字段,使用字符串格式,最大長度32 last_name = models.CharField(max_length = 32 ) email = models.EmailField() #email字段,使用email自帶的格式 def __unicode__( self ): #定義unicode函數,是為了讓對象在實例化的時候,可以返回打印輸出它的名字<阿文>.不至于顯示為<** object> return "%s--%s" % ( self .first_name, self .last_name) |
1
2
3
4
5
6
7
8
9
10
|
#出版社 class Publisher(models.Model): name = models.CharField(max_length = 64 ,unique = True ) #出版社名稱,唯一,是主鍵 address = models.CharField(max_length = 64 ,unique = True ) city = models.CharField(max_length = 32 ) state_province = models.CharField(max_length = 32 ) country = models.CharField(max_length = 32 ) website = models.URLField() #主頁,采用自帶的url格式 def __unicode__( self ): return "%s" % ( self .name) |
1
2
3
4
5
6
|
#定義一個選項,里面包含3個可選框,用以下面的書籍表publisher_state下拉選擇 STATUS_CHOICES = ( ( 'checkout' ,u '已出版' ), ( 'dai' ,u '待出版' ), ( 'status' ,u '審核中' ), ) |
1
2
3
4
5
6
7
8
9
|
#書籍表 class Book(models.Model): name = models.CharField(max_length = 64 ) authors = models.ManyToManyField(Author) #作者,多對多的關系 publisher = models.ForeignKey(Publisher) #出版社,外鍵管理到Publisher表 publisher_date = models.DateField(auto_now_add = True ) publisher_state = models.CharField(max_length = 20 ,choices = STATUS_CHOICES,default = 'checkout' ) #出版狀態,是一個可選框 def __unicode__( self ): return "%s--%s" % ( self .name, self .publisher_date) |
完整的代碼:
1.2然后,創建完models后,一定要創建映射文件,并且映射到數據庫,否則數據庫是不存在的
1
|
python manage.py makemigrations |
1
|
python manage.py migrate |
2.調試shell的models模塊,使用對象操作增刪查改
1
2
3
4
5
6
7
8
9
10
|
##進入shell 模式 python manage.py shell ##導入Publisher對象 from book11.models import Publisher ##查詢id=1的queryset賦值給p p = Publisher.objects.get( id = 1 ) #對的對象進行操作,修改city="changsha",等價于[Publisher.objects.filter(id=1).update(city='changsha')]操作. p.city = 'changsha' #需要提交保存,否則不生效 p.save() |
前后對比,操作數據庫字段就像操作對象一樣簡單!這便是ORM的優勢
3.增加一個admin用戶
1
2
3
4
5
6
|
G:\git\web\books>python manage.py createsuperuser #增加一個超級用戶 Username (leave blank to use 'huan5' ): admin #用戶名 Email address: [email protected] #郵箱 Password: #輸8位密碼2次 Password (again): Superuser created successfully. |
4.編輯admin.py
4.1將models導入,并且注冊網站的Author,Publisher,Boos模塊
1
2
3
4
5
6
|
#設置默認編碼符 # -*- coding: utf-8 -*- from book11 import models #導入數據庫 admin.site.register(models.Author) admin.site.register(models.Publisher) admin.site.register(models.Book) |
1
2
3
4
|
#啟動服務 python manage.py runserver 0.0 . 0.0 : 8086 #并打開瀏覽器執行 http: / / 127.0 . 0.1 : 8086 |
書名已經成功顯示出來
4.2配置一些擴展功能
1
2
3
4
5
6
7
8
9
10
11
12
|
from book11 import models # 創建一個Bookadmin的modeladmin的子類 class Bookadmin(admin.ModelAdmin): list_display = ( 'id' , 'name' , 'publisher' , 'publisher_date' , 'publisher_state' ) search_fields = ( 'name' ,) list_filter = ( 'publisher' , 'publisher_date' ,) list_per_page = 5 list_editable = ( 'name' , 'publisher_state' ,) list_select_related = ( 'publisher' ,) filter_horizontal = ( 'authors' ,) raw_id_fields = ( 'publisher' ,) actions = [ 'set_publisher_checkout' , 'set_publisher_dai' , 'set_publisher_status' , 'set_publisher_del' ,] |
1
2
3
|
admin.site.register(models.Author,Authoradmin) #不要忘了把這些定義好的擴展寫進來 admin.site.register(models.Publisher,Publisheradmin) admin.site.register(models.Book,Bookadmin) |
1
2
3
|
#配置作者頁面的擴展內容 class Authoradmin(admin.ModelAdmin): list_display = ( 'first_name' , 'last_name' , 'email' ) |
1
2
3
|
#配置出版社的擴展顯示 class Publisheradmin(admin.ModelAdmin): list_display = ( 'name' , 'address' , 'country' ,) |
4.3為了批量操作,我們給他增加了actions,定義如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def set_publisher_checkout(modeladmin,request,queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) #選中傳入的表單中,勾選的checkbox對應的id集合 models.Book.objects. filter (id__in = selected).update(publisher_state = 'checkout' ) #將所有選中的id對象,修改出版狀態為checkout def set_publisher_dai(modeladmin,request,queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) models.Book.objects. filter (id__in = selected).update(publisher_state = 'dai' ) def set_publisher_status(modeladmin,request,queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) models.Book.objects. filter (id__in = selected).update(publisher_state = 'status' ) def set_publisher_del(modeladmin,request,queryset): #########擴展部分,增加對選中的記錄今夕刪除!########### selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) models.Book.objects. filter (id__in = selected).delete() ? set_publisher_checkout.short_description = "設置所有的書籍為--已出版" #為了使界面更加友好,添加別名 set_publisher_status.short_description = "設置所有的書籍為--審核中" set_publisher_dai.short_description = "設置所有的書籍為--待出版" set_publisher_del.short_description = "設置所有的書籍為--刪除" |
效果圖
調試成功
附上admin.py的全部代碼,方便調試不成功的小伙伴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
# -*- coding: utf-8 -*- from __future__ import unicode_literals ? from django.contrib import admin from book11 import models # Register your models here. class Bookadmin(admin.ModelAdmin): list_display = ( 'id' , 'name' , 'publisher' , 'publisher_date' , 'publisher_state' ) search_fields = ( 'name' ,) list_filter = ( 'publisher' , 'publisher_date' ,) list_per_page = 5 list_editable = ( 'name' , 'publisher_state' ,) list_select_related = ( 'publisher' ,) filter_horizontal = ( 'authors' ,) raw_id_fields = ( 'publisher' ,) actions = [ 'set_publisher_checkout' , 'set_publisher_dai' , 'set_publisher_status' , 'set_publisher_del' ,] ? def set_publisher_checkout(modeladmin,request,queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) models.Book.objects. filter (id__in = selected).update(publisher_state = 'checkout' ) def set_publisher_dai(modeladmin,request,queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) models.Book.objects. filter (id__in = selected).update(publisher_state = 'dai' ) def set_publisher_status(modeladmin,request,queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) models.Book.objects. filter (id__in = selected).update(publisher_state = 'status' ) def set_publisher_del(modeladmin,request,queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) models.Book.objects. filter (id__in = selected).delete() ? set_publisher_checkout.short_description = "設置所有的書籍為--已出版" set_publisher_status.short_description = "設置所有的書籍為--審核中" set_publisher_dai.short_description = "設置所有的書籍為--待出版" set_publisher_del.short_description = "設置所有的書籍為--刪除" ? class Authoradmin(admin.ModelAdmin): list_display = ( 'first_name' , 'last_name' , 'email' ) ? class Publisheradmin(admin.ModelAdmin): list_display = ( 'name' , 'address' , 'country' ,) ? admin.site.register(models.Author,Authoradmin) admin.site.register(models.Publisher,Publisheradmin) admin.site.register(models.Book,Bookadmin) |
不禁感嘆再也沒有比django更加簡單好用,容易操作的后臺了.
總結
Django真的太強大。。
以上就是本文關于Django admin實現圖書管理系統菜鳥級教程完整實例的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://www.yueguangzu.net/?p=1181