Django-图书管理系统开发
图书管理系统开发
Django Admin提供了对数据模型进⾏管理的Web⽹站,起到系统管理后台的作⽤。它通过读取开发⼈员建⽴的数据模型,快速构建出⼀个对数据进⾏管理的Web⽹站,可⽤于开发测试、简单管理等。
系统数据库建⽴
建⽴应⽤程序
利⽤前⾯的myproject项⽬,在项⽬中建⽴⼀个应⽤程序book: python manage.py startapp book。
然后到settings⾥⾯注册。
建⽴数据库表
book存储图书信息,publishing存储出版社信息,author存储作者相关信息,在models中输⼊:
from django.db import models
class book(models.Model):
# 利⽤verbose_name让字段显⽰汉字名称
title = models.CharField(max_length=20,verbose_name='图书名称')
descript = models.TextField(verbose_name='书籍简介')
publishdate = models.DateField(verbose_name='出版⽇期')
# 外键,多对⼀关系,⼀定要加上on_delete属性
publishing = models.ForeignKey(to='publishing',on_delete=models.CASCADE,verbose_name='出版社')
# 多对多键
author = models.ManyToManyField(to='author',verbose_name='作者')
class Meta:
verbose_name='图书信息'
verbose_name_plural='图书信息'
def __str__(self):
return self.title+'--相关图书信息'
class publishing(models.Model):
name = models.CharField(max_length=20,verbose_name='出版社名称')
address = models.CharField(max_length=20,verbose_name='出版社地址')
class Meta:
verbose_name = '出版社信息'
verbose_name_plural = '出版社书信息'
def __str__(self):
return '社名:'+self.name
class author(models.Model):
name = models.CharField(max_length=10,verbose_name='姓名')
email = models.EmailField(verbose_name='邮箱')
birthday = models.DateField(verbose_name='出⽣⽇期')
header = models.ImageField(verbose_name='作者头像')
class Meta:
verbose_name = '作者基本情况'
verbose_name_plural = '作者基本情况'
def __str__(self):
return '作者:'+self.name
说明:
数据模型都继承⾃Model类,⾸先导⼊相关模块。
book中的publishing字段是外键,表⽰book表的记录与publishing表的记录是多对⼀的关系,即⼀本书对应⼀个出版社,⼀个出版社可以出多本书,外键必须有on_delete属性,on_delete=models.CASCADE表⽰级联删除,即⼀对多关系的⼀被删除,多也被删除。
class Meta指定数据模型的元数据,下⾯介绍⼏个常⽤的元数据:
verbose_name:数据模型对象的单数名,如不指定,默认⽤⼩写的数据模型名。如数据模型book的单数名默认为book。
verbose_name='图书信息'
verbose_name_plural:数据模型对象的复数名,中⽂通常不区分单复数,可以和verbose_name⼀样。如不指定该选项,默认的复数名是verbose_name加s。
verbose_name_plural='图书信息'
ordering:指定的排序⽅式,接收字段名组成的元组或列表。字段名前加-表⽰倒序。
ordering = ['-publishing','author']
unique_together:联合约束,把⼏个字段组合在⼀起作为约束条件,约束是唯⼀的。
unique_together=('title','author')
def __str__(self)函数通过return返回⼀个字符串,代表数据模型对象实例(相当于⼀条记录)的名字,相当于对象实例的别名。
author中header字段的类型是ImageField类型。Django先上传图⽚,然后在数据库表的字段中保存图⽚上传的位置。
下⾯介绍图⽚⽂件存储地址是如何设置的,settings中:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_URL='/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,'image')
BASE_DIR变量通过系统路径函数取得地址/myproject/。
MEDIA_ROOT为/myproject/image/。新建⽂件夹image。
MEDIA_URL和MEDIA_ROOT有关联关系,前者代表URL中的地址前缀,当URL有这个前缀时,会解
析为/myproject/image/。
如"href=/media/test/test.jpg"会解析为"href=/myproject/image/test/test.jpg"。
设计完数据模型要⽣成数据库表:
python manage.py makemigrations
python manage.py migrate
外键的字段名为外键名_id。book_book_author是多对多键author字段⽣成的中间表。
建⽴系统超级⽤户
python manage.py createsuperuser
数据模型注册
数据模型需要注册到Django Admin后台才能被管理,在admin中输⼊:
ib import admin
from . import models
ister(models.book)
ister(models.publishing)
ister(models.author)
运⾏程序
当建⽴数据模型并注册时,Django Admin就可以管理数据模型对应的数据库表的数据,并且不⽤写任何代码就可以实现增删改查功能,⽽且⾃动通过外键、多对多键建⽴起数据库表之间的关系。
附加说明
在管理后台中,每个数据模型都有⼀个列表页⾯和编辑表单页⾯,前者列出数据表中的记录,后者⽤于添加、修改或删除数据表中的特定记录。
管理后台⼯作原理简述如下:
启动程序后,Django运⾏admin.autodiscover()函数,这个函数到settings⽂件中查询INSTALLED_AP
PS设置。然后根据其列举的应⽤程序,到各个应⽤程序中查⼀个名为admin的⽂件并执⾏⾥⾯的代码。
在应⽤程序的admin⽂件中调⽤ister()在管理后台中注册各个数据模型,只有注册的数据模型才能在管理后台中显⽰。
Django Admin管理后台应⽤程序也有admin⽂件,管理后台应⽤程序定义了两个数据模型User和Groups并在admin中注册,因此管理页⾯中能显⽰User和Groups。
Django Admin管理后台实际上是⼀个Django应⽤程序,有⾃⼰的数据模型、模板⽂件、视图⽂件等。
图书管理系统完善
部分设置
设置中⽂
LANGUAGE_CODE = 'zh-hans' # 让页⾯显⽰中⽂
TIME_ZONE = 'Asia/shanghai' # 中⽂格式的时间
设置图⽚⽂件路径
图⽚能够在⽹页显⽰是因为在HTML⽂件中指定了路径,Django程序运⾏时通过这个指定的路径到图⽚⽂件,所以要在路由系统中设定寻⽅向:
from . import settings
f.urls.static import static
urlpatterns = [
path('admin/',admin.site.urls),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
说明:
⾸先导⼊静态⽂件处理相关⽂件然后通过static()函数指定⼀个对应关系,有两个参数,⼀个是URL路径前缀,⼀个是路径前缀代表的地址。这两个参数在settings中已经设置。将static函数的返回值加在列表项后即可实现静态⽂件路径设置。
页⾯功能完善
Django Admin管理后台系统会针对每⼀个数据模型⽣成列表页⾯和修改页⾯,我们完善系统的⽅式也是针对这两种页⾯。
Django提供的ModelAdmin类就是针对这两类页⾯进⾏定制的类,在这个类中的设置会改变页⾯的功能与外观。配置编写ModelAdmin类的代码通常保存在每个应⽤程序的admin.py⽂件中。
ib import admin
from . import models
class bookadmin(admin.ModelAdmin):
# ⽤出版⽇期作为导航查询字段
date_hierarchy = 'publishdate'
# 设置字段⽆值时显⽰的内容
empty_value_display = '-⽆值-'
# 设置author字段的选择⽅式为⽔平扩展选择
filter_horizontal = ('author',)
# 以下代码在页⾯上对字段进⾏分组显⽰或布局django admin 自定义页面
fieldsets = (
(
'图书信息',
{'fields': (('title', 'publishdate'), 'publishing', 'author')}),
(
'图书简介',
{'classes': ('collapse',), 'fields': ('descript',)}),
)
# ⾃定义⼀个字段
def descript_str(self, obj):
# 对字段进⾏切⽚,取前20个字符
return obj.descript[:20]
# 设置⾃定义字段名字
descript_str.short_description = '简介'
# 设置过滤导航字段
list_filter = ('title', 'publishing', 'author')
# 设置查询的字段
search_fields = ('title', 'publishing__name', 'author__name')
# 列表显⽰字段
list_display = ('title', 'descript_str', 'publishdate', 'publishing',)
# 显⽰查询到的记录数
show_full_result_count = True
# 设定每页显⽰6条数据
list_per_page = 6
ister(models.book, bookadmin)
说明:
代码定义了bookadmin类,这个类继承于admin.ModelAdmin,在这个类中我们可以通过设置类的各种属性来定制数据管理页⾯的功能与外观。
影响列表页⾯的属性介绍如下:
date_hierarchy:根据指定的⽇期型字段,为页⾯创建⼀个时间导航栏,赋值类型是元组类型。
# ⽤出版⽇期作为导航查询字段
date_hierarchy = 'publishdate'
list_display:指定显⽰在列表页⾯上的字段。如果不设置这个属性,列表页⾯只显⽰⼀列,内容是每个数据模型对象的__str__()函数的返回值。
# 列表显⽰字段
list_display = ('title', 'descript_str', 'publishdate', 'publishing',)
search_fields:在列表页⾯添加⼀个⽂本框,这个属性需要以元组数据类型赋值,元组中每个字段都可以作为模糊查询的条件,被搜索的字段⼀般是CharField和TextField类型。也可以通过双下划线关联到另⼀个表的外键、多对多键字段。
# 设置查询的字段
search_fields = ('title', 'publishing__name', 'author__name')
list_display_links:指定⽤于链接修改页⾯的字段,设置⽅式与list_display格式⼀样,默认情况,list_display列表中的第⼀个元素被作为指向修改页⾯的链接。如果设置为None则没有链接,将⽆法跳转到修改页⾯。
list_display_links = ('title','descript_str')
list_filter:设置list_filter属性,在列表页⾯的右侧栏增加过滤导航功能,实现基于字段的过滤功能。
# 设置过滤导航字段
list_filter = ('title', 'publishing', 'author')
list_editable:指定在列表页⾯中可以被编辑的字段,指定的字段将显⽰为⽂本框,可修改后直接批量保存。不能将list_display中没有的字段、list_display_links中的字段设置为list_editable中的字段。
list_editable = ('descript_str','publishdate')
empty_value_display:指定字段为空时(字段值为null、None、空字符等)显⽰的内容。
empty_value_display = '-⽆值-'
show_full_result_count:⽤于设置是否显⽰查询到的记录总数。
show_full_result_count = True
per_page:设置列表页⾯每页显⽰多少条记录。
list_per_page = 6
影响修改页⾯的属性介绍如下:
fields:列出修改页⾯上的字段,并按列表顺序排列指定的字段。赋值时可以通过组合元组的⽅式,让某些字段在同⼀⾏内显⽰,例如下⾯的第⼆⾏代码,title、publishdate两个字段将排列在⼀⾏,⽽descript字段则排在下⼀⾏。
# 指定在修改页⾯上显⽰的字段以及显⽰信息,⼀⾏显⽰⼀个字段
fields=('title','descript','publishdate','publishing','author')
# 把title、publishdate两个字段排在⼀⾏
fields=(('title','publishdate'),'descript')
exclude:列出的字段不在页⾯上显⽰。
exclude=('descript',)
fieldsets:在页⾯上对字段进⾏分组或布局,fieldsets是⼀个⼆级元组的列表。每⼀个⼆级元组代表⼀
个<fieldset>,在HTML页⾯表单中⽣成⼀个<fieldset>标签。第⼆级元组列表格式为(name,{'fields':(field1,field2,...),'classes' 'collapse',)}),name表⽰fieldsets标题,(field1,field2,...)是包含在fieldsets内的字段列表,另外还可设置fieldsets的样式。
# 以下代码在页⾯上对字段进⾏分组显⽰或布局
fieldsets = (
(
'图书信息',
{'fields': (('title', 'publishdate'), 'publishing', 'author')}),
(
'图书简介',
{'classes': ('collapse',), 'fields': ('descript',)}),
)
如下图,title和publishdate在⼀⾏上的原因是通过('title', 'publishdate')显⽰在⼀⾏。
filter_horizontal:主要针对多对多键字段,把选择⽅式改为⽔平扩展选择,形式如上图的作者字段中的样式。多对多键字段在django admin页⾯中默认显⽰为⼀个选择框。在需要从⼤量记录中选择时,设置字段的这个属性,页⾯就会对字段进⾏⽔平扩展,并提供过滤功能。
# 设置author字段的选择⽅式为⽔平扩展选择
filter_horizontal = ('author',)
radio_fields:外键ForeignKey字段或choices集合默认使⽤select标签显⽰。如果将这种字段属性为radio_fields,则会以radio标签组的形式展⽰。Radio_fields的值是字典形式,键名为字段名,键值有两个,即admin.VERTICAL、admin.HORIZONTAL,⼀个是垂直布局,⼀个是⽔平布局。
# 垂直布局
radio_fields = {'publishing':admin.VERTICAL}
⾃定义字段。前⾯代码中定义⼀个字段descript_str,定义字段采⽤函数的形式,传⼊两个参数。第⼀个参数是self,第⼆个参数代表与类bookadmin关联的数据模型对象,这⾥指的是book类实例对象。⾃定义字段函数体return的返回值就是⾃定义字段值。⾃定义字段可以通过short_description命名字段。
代码中⾃定义字段descript_str的值取book的数据记录的descript字段值前20个字符:
# ⾃定义⼀个字段
def descript_str(self, obj):
# 对字段进⾏切⽚,取前20个字符
return obj.descript[:20]
# 设置⾃定义字段名字
descript_str.short_description = '简介'
建⽴了继承于admin.ModelAdmin的类后必须将类注册到管理⽹站,上⾯的代码通过ister(models.book, bookadmin)将book数据模型注册,将models.book和bookadmin关联起来,以后在列表页⾯、修改页⾯上管理book中的数据采⽤的是bookadmin类中定义的形式。
下⾯是admin中的第⼆段代码,定义了管理publishing数据的页⾯形式。
class publishingadmin(admin.ModelAdmin):
list_display = ('name','address')
list_editable = ('address',)
list_per_page = 10
ister(models.publishing,publishingadmin)
下⾯是第三段代码,定义author数据的页⾯功能与样式:
from django.utils.safestring import mark_safe
class authoradmin(admin.ModelAdmin):
# ⾃定义字段,使图⽚带有HTML格式并显⽰
# mark_safe函数避免格式字符被转义
def header_data(self,obj):
return mark_safe(u'<img src="/media/%s" width="50px" height="30px"/>' % obj.header)
# 定义字段名称
header_data.short_description = '简介'
list_display = ('name','email','birthday','header_data')
list_per_page = 10
ister(models.author,authoradmin)
说明:
代码通过函数形式⾃定义了⼀个字段header_data,第⼀个参数self代表类本⾝,第⼆个参数obj代表关联的数据模型对象,这⾥指的是author数据模型的实例对象。这个⾃定义字段函数通过return返回⼀个img标签作为字段值。
通过list_display = ('name','email','birthday','header_data')把⾃定义字段放在其中,值是img标签。
批处理功能
在对数据库表的数据进⾏修改时,采取的操作⽅式是选中记录,然后到修改页⾯中修改相应的字段。
如果要同时修改多条数据,这样的操作是重复的。Django Admin提供了⾃定义函数actions,这样就可以实现对数据的批量修改。
下⾯把book表中已选中记录的出版社改为“新⽣活出版社”,在bookadmin类中加⼊以下代码:
# 定义批处理⽅法
def change_publishing(self,request,queryset):
publishing_obj=models.(name='新⽣活出版社')
rows=queryset.update(publishing=publishing_obj)
change_publishing.short_description='选中记录的出版社改为“新⽣活出版社”'
# 把⽅法名加到actions中
actions = ['change_publishing']
说明:
定义批处理⽅法采⽤函数定义的⽅式。这个函数有三个参数:self指的是类本⾝,request指的是当前的HttpRequest对象,queryset指的是被选中的对象(记录)。
代码⾸先取得name=新⽣活出版社的记录对象,然后通过queryset.update把这个对象赋给publishing字段。批处理成功后通过
定义好批处理⽅法后要加到actions属性才能起作⽤。
权限管理
权限管理指的是根据系统设置的安全规则或者安全策略,使得⽤户可以访问⽽且只能访问被授权的资源。
Django Admin提供的权限管理机制能够约束⽤户⾏为,控制页⾯的显⽰内容,安全且灵活。
Django Admin采⽤⽤户、组、权限构成了权限管理机制,我们在系统中建⽴的每⼀个数据模型都会有4个默认的权限,即add、change、delete、view,权限管理就是把属于数据模型的某个权限赋予⽤户或组。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论