一、系统数据库建立
创建django项目
建立一个项目MyProject,包含app book;建立数据库表
在book下的models.py中创建3个数据模型表:book(存储图书信息)、publishing(存储出版社信息)、author(存储作者相关信息);
from django.db import models
# 图书表
class book(models.Model):
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指定在admin管理界面中显示中文;
# verbose_name表示单数形式的显示,verbose_name_plural表示复数形式的显示;中文的单数和复数一般不作区别。
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
运行生成数据库表,会生成4张表,book多对多a键author字段会生成一个中间表,记录book_id,author_id.
python manage.py makemigrations
python manage.py migrate
3. 创建超级用户
Django Admin管理后台需要系统超级用户,创建超级用户需要在命令行终端进行,进入项目根目录,输入一下命令,并按照提示注册。这个用户可以登录Django Admin管理后台,并能对各个数据库表进行管理。
4. 数据模型注册
在Django admin后台中注册我们刚刚建成的3个数据模型才能管理。注册是在每个应用程序的admin.py中。本项目就是在book下的admin.py文件。
from django.contrib import admin
from . import models
admin.site.register(models.book)
admin.site.register(models.publishing)
admin.site.register(models.author)
5. 运行程序
写到这一步,就可以使用Django Admin来管理数据模型对应的数据库表的数据,并且不需要写任何代码就能实现增、删、改、查功能,而且自动通过外键、多对多建立起数据库表之间的关系。
在命令行输入一下命令启动程序
python manage.py runserver
用浏览器打开 http://127.0.0.1:8000/admin/ 使用步骤3注册的超级用户账户登录,可以看到3个数据库表的列表,并且能对每个表进行维护。这是因为在urls.py文件中已自动配置了URL与视图函数的对应关系。
二、图书管理系统完善
部分配置问题
设置中文LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
在setting.py文件中设置,LANGUAGE_CODE和TIME_ZONE
设置图片文件路径,在路由系统中设定,以下为urls.py中设置
from . import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
通过static()函数指定一个对应关系,static两个参数,一个为URL路径前缀,一个是路径前缀代表的地址。
页面功能完善
Django Amdin管理后台系统会针对每个数据模型生成列表页面和修改页面两类页面。ModelAdmin类就是针对这两类页面进行定制类,在这个类中的设置会改变页面的功能与外观。配置编写ModelAdmin类的代码通常写在admin.py中,代码如下。
from django.contrib import admin
from . import models
from django.utils.safestring import mark_safe
class bookadmin(admin.ModelAdmin):
"""
设置类的各个属性来定制管理页面的功能和外观
"""
# 用出版日期作为导航查询字段
date_hierarchy = 'publishdate'
# 设置字段无值时显示的内容
empty_value_display = '请输入'
# 设置author字段的选择方式为水平扩展选择
filter_horizontal = ('author',)
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
# 定义批处理方法
def change_publishing(self, request, queryset):
publishing_obj = models.publishing.objects.get(name='新生活出版社')
rows = queryset.update(publishing=publishing_obj)
self.message_user(request, '%s 条记录被修改成"新生活出版社"' % rows)
change_publishing.short_description = '选中记录的出版社改为"新生活出版社"'
# 把方法名加到actions中
actions=['change_publishing']
admin.site.register(models.book, bookadmin)
class publishingadmin(admin.ModelAdmin):
# 页面显示两个字段
list_display = ('name', 'address')
# address可编辑修改
list_editable = ('address',)
# 设定每页显示10条记录
list_per_page = 10
admin.site.register(models.publishing, publishingadmin)
class authoradmin(admin.ModelAdmin):
# 自定义字段,使图片带有HTML格式并显示
def header_data(self, obj):
# mark_safe()函数避免格式字符被转义,防止HTML代码被转义
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
admin.site.register(models.author, authoradmin)