资讯专栏INFORMATION COLUMN

python大佬养成计划----Django图书人物适配系统(后台)

lufficc / 2063人阅读

摘要:是重量级选手中最有代表性的一位。是一个开放源代码的应用框架,由写成。使用用户登陆后台管理时,将只有增加组的选项。人物属性姓名,性别,简介,所属书籍。

Django

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。
Django是一个开放源代码的Web应用框架,由Python写成。

Django基础

版本:Django 1.10
使用Pycharm创建新项目Django,命名为FirstDjango
有FirstDjango目录,templates目录,manage.py文件
运行manage.py文件类似flask_script命令行

 python manage.py makemigrations   #相当于初始化数据库表
 python manage.py migrate #相当于数据库迁移命令,这里的数据库存储都是放在db.sqlite3文件里
 python manage.py createsuperuser #创建超级用户,生成db.sqlite3文件
 python manage.py runserver 7899 #默认端口号:8000

访问http://127.0.0.1:7899/,可以看见It worked页面,但还没有真正的运行APP

修改语言,时区(setting.py)

# LANGUAGE_CODE = "en-us"
LANGUAGE_CODE = "zh-hans"

# TIME_ZONE = "UTC"
TIME_ZONE = "Asia/Shanghai"

Django不同于flask,不需要在每次修改代码时,重启程序。

http://127.0.0.1:7899/admin/,可以访问到后台管理
这里可以添加新用户和新的组,新的用户、组可以被分配权力,但不能执行超级用户的分发权限的功能
示例:给add_group组添加‘Can add group ’
创建用户normal,隶属add_group组,勾选职员状态(指明用户是否可以登录到这个管理站点)。
使用normal用户登陆后台管理时,将只有增加组的选项。

创建自己的应用(app) -- book

terminal输入

python manage.py startapp book

会在当前项目里生成book/目录

创建好自己的应用文件后,首先在项目里注册应用setting.py

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "book",
]

开始写数据库结构(model.py)

首先确定数据库表有哪些:书籍、人物。
然后确定每个表的结构,书籍的属性有:id,标题,出版时间,摘要,封面。人物属性:id,姓名,性别,简介,所属书籍。
最后确定表之间的关系:一个书籍里面有多个人物,人物数据库表写外键

在django框架结构里,不需要像flask写反向引用

# book/models.py
from django.db import models

# Create your models here.
class BookInfo(models.Model):
    # 这里不需要写id,Django框架默认会生成id,并作为主键pk
    btitle = models.CharField(max_length=100,unique=True,verbose_name="书籍标题")     # 表示在后台管理中这一栏的中文显示
    bpub_time  = models.DateField(verbose_name="出版时间")
    # bcontent = models.TextField(default="摘要",verbose_name="书籍摘要")
    # bimg = models.ImageField(default=None,upload_to="static/uploads/")
    class Meta:    ##表示这个数据库表在后台中的中文显示,因为英语区分单复数,所以需要写上单复数的中文显示
        verbose_name = "书籍信息"
        verbose_name_plural = "书籍信息"
    def __str__(self):
        return "%s" %(self.btitle)

class HeroInfo(models.Model):
    hname = models.CharField(max_length=50,verbose_name="人物姓名")
    hgender = models.BooleanField(default=True,verbose_name="人物性别")
    # 任务简介
    hcontent = models.TextField(verbose_name="人物简介")
    # 多的一端写外键
    hbook = models.ForeignKey(BookInfo,verbose_name="所属书籍")
    @property
    def gender(self):
        if self.hgender:
            return "男"
        else:
            return "女"
    class Meta:
        verbose_name = "人物信息"
        verbose_name_plural = "人物信息"
    def __str__(self):
        return "%s" %(self.hname)
使用sqlite3文件类型数据库

Django默认使用sqlit3数据库,可在项目的setting.py文件中查看

DATABASES = {
    "default": {
         "ENGINE": "django.db.backends.sqlite3",
         "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
     }
}

写好应用book的models.py文件后,我们开始创建数据库

python manage.py makemigrations   
python manage.py migrate 

如何进入sqlite3数据库表

python manage.py shell    #打开类似数据库交互命令的窗口
1. 数据库的增添数据
>>> from book.models import BookInfo,HeroInfo
>>> from datetime import date
>>> book1 = BookInfo(btitle="小王子",bpub_time=date(1942,5,13))
>>> book1.save()
2. 数据库的查找
>>> BookInfo.objects.all()
]>

根据指定信息查找

>>> book = BookInfo.objects.get(id=1)
>>> book.btitle
"小王子"
3.数据库数据的修改
>>> book1.btitle = "安徒生童话"
>>> book1.save()
>>> book = BookInfo.objects.get(id=1)
>>> book.btitle
"安徒生童话"
4. 数据库数据的删除
>>> book = BookInfo.objects.get(id=1)
>>> book.delete()
(1, {"book.HeroInfo": 0, "book.BookInfo": 1})
>>> book = BookInfo.objects.all()
>>>
5. 数据库表之间的关联
 首先,创建没有外键的数据库表信息
>>> book1 = BookInfo(btitle="小王子",bpub_time=date(1942,5,13))
>>> book2 = BookInfo(btitle="睡美人",bpub_time=date(1952,6,29))
>>> book1.save()
>>> book2.save()
然后,创建外键所在的数据库表信息
1. 根据数据表结构直接创建人物
>>> hero1 = HeroInfo(hname="小王子",hgender=True,hcontent="小王子没有被成人那骗人的世界所征服",hbook=book1)
>>> hero1 = HeroInfo(hname="玫瑰花",hgender=False,hcontent="玫瑰花的虚荣心伤害了小王子对她的感情",hbook=book1)
>>> hero1.save()
>>> hero2.save()
2. 根据已知的书籍对应的人物信息中添加人物
>>> book1 = BookInfo.objects.get(id=2)
>>> book1.heroinfo_set.all()
, ]>
>>> book1.heroinfo_set.create(hname="小狐狸",hgender=True,hcontent="肉眼看不见事务的本质,只有用心灵才能洞察一切")

查询人物信息有两种方式
1. 根据人物数据库表直接查找
>>> HeroInfo.objects.all()
, ]>
2. 根据与数据对象的关系查找
>>> book1 = BookInfo.objects.get(id=2)
>>> book1.heroinfo_set.all()
, ]>
>>>
使用mysql文件类型数据库

修改setting.py文件中的数据库配置

# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases

DATABASES = {
    "default": {
        # "ENGINE": "django.db.backends.sqlite3",
        # "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
        "ENGINE": "django.db.backends.mysql",
        "NAME": "firstdjango",    #数据库名称,若没有的话,先在数据库中建立
        "USER": "root",
        "PASSWORD": "sheen",
        "HOST": "localhost",
        "PORT": "3306",
    }
}
这里若直接初始化数据库会报错
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named "MySQLdb"
需要对项目的__init__.py文件进行设置
# PycharmProjectsFristDjangoFristDjango\__init__.py
import pymysql
pymysql.install_as_MySQLdb()

终端运行命令,在mysql数据库中,就可以查看到所有的表信息

 python manage.py makemigrations  
 python manage.py migrate 
站点对数据库的操作

通过命令对数据库的操作尤不方便,我们通过后台管理的网页来实现对数据库的操作
首先需在admin.py文件中注册数据库表

#book/admin
from django.contrib import admin
from book.models import BookInfo,HeroInfo
# Register your models here.
admin.site.register(BookInfo)
admin.site.register(HeroInfo)


书籍信息只显示标题,和人物信息只显姓名,不利于查看,修改注册的表结构

#book/admin.py
from django.contrib import admin
from book.models import BookInfo,HeroInfo

# Register your models here.

class BookInfoAdmin(admin.ModelAdmin):
    list_display = ["btitle","bpub_time"]

class HeroInfoAdmin(admin.ModelAdmin):
    list_display = ["hname","hgender","hcontent","hbook"]   #显示栏
    list_filter = ["hbook"] #过滤器
    search_fields = ["hname","hbook"]   #搜索栏
    list_per_page = 2   #每页显示多少条数据
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)

如何在图书表中直接添加人物,网页显示效果:如果跳转到图书详情的页面,可以直接添加人物
添加HeroInline类,修改BookInfoAdmin类
# book/admin.py
class HeroInline(admin.TabularInline):
    model = HeroInfo
    extra = 2   #每次增加两个添加人物的表单
    

class BookInfoAdmin(admin.ModelAdmin):
    list_display = ["btitle","bpub_time"]
    inlines = [HeroInline]