Django admin實(shí)現(xiàn)圖書管理系統(tǒng)菜鳥級(jí)教程完整實(shí)例
Django 有著強(qiáng)大而又及其易用的admin后臺(tái),在這里,你可以輕松實(shí)現(xiàn)復(fù)雜代碼實(shí)現(xiàn)的功能,如搜索,篩選,分頁,題目可編輯,多選框.
簡(jiǎn)單到,一行代碼就可以實(shí)現(xiàn)一個(gè)功能,而且模塊之間耦合得相當(dāng)完美.
不信,一起來看看吧!?用Django實(shí)現(xiàn)管理書籍的系統(tǒng),并能在前臺(tái)界面對(duì)書籍進(jìn)行增刪查改,篩選,分頁,以及批量查詢修改功能.
準(zhǔn)備工作
#準(zhǔn)備好你的數(shù)據(jù)庫模型思維導(dǎo)圖
0.新建一個(gè)Django項(xiàng)目,起名為books,并且同時(shí)新建一個(gè)應(yīng)用book11
1.首先要設(shè)置models模塊,根據(jù)思維導(dǎo)圖,我們知道需要定義3張表,分別是Book,Author,Publisher.
1.1然而,django強(qiáng)大的地方在于,你無需在數(shù)據(jù)庫開辟一張表,ORM的模型,讓你只需要關(guān)注你要操作的對(duì)象.這里用類對(duì)象,來替代表,從而使得定義一張數(shù)據(jù)表Book,就只需要簡(jiǎn)單的創(chuàng)建Book類對(duì)象,即可
#先設(shè)計(jì)作者Author對(duì)象(表)[models.py] class Author(models.Model): #繼承于models.Model這個(gè)父類,從而實(shí)現(xiàn)多態(tài) first_name=models.CharField(max_length=32) #名字的字段,使用字符串格式,最大長(zhǎng)度32 last_name=models.CharField(max_length=32) email=models.EmailField() #email字段,使用email自帶的格式 def __unicode__(self): #定義unicode函數(shù),是為了讓對(duì)象在實(shí)例化的時(shí)候,可以返回打印輸出它的名字<阿文>.不至于顯示為<** object> return "%s--%s"%(self.first_name,self.last_name)
#出版社 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)
#定義一個(gè)選項(xiàng),里面包含3個(gè)可選框,用以下面的書籍表publisher_state下拉選擇 STATUS_CHOICES=( ('checkout',u'已出版'), ('dai',u'待出版'), ('status',u'審核中'), )
#書籍表 class Book(models.Model): name=models.CharField(max_length=64) authors=models.ManyToManyField(Author) #作者,多對(duì)多的關(guān)系 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') #出版狀態(tài),是一個(gè)可選框 def __unicode__(self): return "%s--%s"%(self.name,self.publisher_date)
完整的代碼:
1.2然后,創(chuàng)建完models后,一定要?jiǎng)?chuàng)建映射文件,并且映射到數(shù)據(jù)庫,否則數(shù)據(jù)庫是不存在的
python manage.py makemigrations
python manage.py migrate
2.調(diào)試shell的models模塊,使用對(duì)象操作增刪查改
##進(jìn)入shell 模式 python manage.py shell ##導(dǎo)入Publisher對(duì)象 from book11.models import Publisher ##查詢id=1的queryset賦值給p p=Publisher.objects.get(id=1) #對(duì)的對(duì)象進(jìn)行操作,修改city="changsha",等價(jià)于[Publisher.objects.filter(id=1).update(city='changsha')]操作. p.city='changsha' #需要提交保存,否則不生效 p.save()
前后對(duì)比,操作數(shù)據(jù)庫字段就像操作對(duì)象一樣簡(jiǎn)單!這便是ORM的優(yōu)勢(shì)
3.增加一個(gè)admin用戶
G:\git\web\books>python manage.py createsuperuser #增加一個(gè)超級(jí)用戶 Username (leave blank to use 'huan5'): admin #用戶名 Email address: admin@qq.com #郵箱 Password: #輸8位密碼2次 Password (again): Superuser created successfully.
4.編輯admin.py
4.1將models導(dǎo)入,并且注冊(cè)網(wǎng)站的Author,Publisher,Boos模塊
#設(shè)置默認(rèn)編碼符 # -*- coding: utf-8 -*- from book11 import models #導(dǎo)入數(shù)據(jù)庫 admin.site.register(models.Author) admin.site.register(models.Publisher) admin.site.register(models.Book)
#啟動(dòng)服務(wù) python manage.py runserver 0.0.0.0:8086 #并打開瀏覽器執(zhí)行 http://127.0.0.1:8086
書名已經(jīng)成功顯示出來
4.2配置一些擴(kuò)展功能
from book11 import models # 創(chuàng)建一個(gè)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',]
admin.site.register(models.Author,Authoradmin) #不要忘了把這些定義好的擴(kuò)展寫進(jìn)來 admin.site.register(models.Publisher,Publisheradmin) admin.site.register(models.Book,Bookadmin)
#配置作者頁面的擴(kuò)展內(nèi)容 class Authoradmin(admin.ModelAdmin): list_display=('first_name','last_name','email')
#配置出版社的擴(kuò)展顯示 class Publisheradmin(admin.ModelAdmin): list_display = ('name','address','country',)
4.3為了批量操作,我們給他增加了actions,定義如下
def set_publisher_checkout(modeladmin,request,queryset): selected=request.POST.getlist(admin.ACTION_CHECKBOX_NAME) #選中傳入的表單中,勾選的checkbox對(duì)應(yīng)的id集合 models.Book.objects.filter(id__in=selected).update(publisher_state='checkout') #將所有選中的id對(duì)象,修改出版狀態(tài)為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): #########擴(kuò)展部分,增加對(duì)選中的記錄今夕刪除!########### selected=request.POST.getlist(admin.ACTION_CHECKBOX_NAME) models.Book.objects.filter(id__in=selected).delete() set_publisher_checkout.short_description="設(shè)置所有的書籍為--已出版" #為了使界面更加友好,添加別名 set_publisher_status.short_description="設(shè)置所有的書籍為--審核中" set_publisher_dai.short_description="設(shè)置所有的書籍為--待出版" set_publisher_del.short_description="設(shè)置所有的書籍為--刪除"
效果圖
調(diào)試成功
附上admin.py的全部代碼,方便調(diào)試不成功的小伙伴
# -*- 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="設(shè)置所有的書籍為--已出版" set_publisher_status.short_description="設(shè)置所有的書籍為--審核中" set_publisher_dai.short_description="設(shè)置所有的書籍為--待出版" set_publisher_del.short_description="設(shè)置所有的書籍為--刪除" 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更加簡(jiǎn)單好用,容易操作的后臺(tái)了.
總結(jié)
Django真的太強(qiáng)大。。
以上就是本文關(guān)于Django admin實(shí)現(xiàn)圖書管理系統(tǒng)菜鳥級(jí)教程完整實(shí)例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
Python通過Django實(shí)現(xiàn)用戶注冊(cè)和郵箱驗(yàn)證功能代碼
Python編程django實(shí)現(xiàn)同一個(gè)ip十分鐘內(nèi)只能注冊(cè)一次
如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Python使用pymupdf實(shí)現(xiàn)PDF加密
這篇文章主要介紹了如何使用 Python 和 wxPython 庫創(chuàng)建一個(gè)簡(jiǎn)單的圖形用戶界面(GUI)應(yīng)用程序,用于對(duì) PDF 文件進(jìn)行加密,感興趣的小伙伴可以了解下2023-08-08淺談python連續(xù)賦值可能引發(fā)的錯(cuò)誤
今天小編就為大家分享一篇淺談python連續(xù)賦值可能引發(fā)的錯(cuò)誤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11python執(zhí)行等待程序直到第二天零點(diǎn)的方法
這篇文章主要介紹了python執(zhí)行等待程序直到第二天零點(diǎn)的方法,涉及Python等待程序的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-04-04Python函數(shù)元數(shù)據(jù)實(shí)現(xiàn)為一個(gè)參數(shù)指定多個(gè)類型
這篇文章主要介紹了Python函數(shù)元數(shù)據(jù)實(shí)現(xiàn)為一個(gè)參數(shù)指定多個(gè)類型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Python中flatten( )函數(shù)及函數(shù)用法詳解
flatten是numpy.ndarray.flatten的一個(gè)函數(shù),即返回一個(gè)一維數(shù)組。這篇文章主要介紹了Python中flatten( )函數(shù),需要的朋友可以參考下2018-11-11