简单图书-人物系统(了解Django项目数据库模型、启用后台Admin站点管理、Django前台管理(结合html文件)及Django请求的生命周期)

第三步: 项目的数据库模型

(1). 连接 数据库配置

在 settings.py 文件中,通过DATABASES项进行数据库设置
Django 支持的数据库包括: sqlite 、 mysql 等主流数据库
Django 默认使用 **SQLite** 数据库

Django数据库设置参考文档

其中ENGINE设置为数据库后端使用。内置数据库后端有:

'django.db.backends.postgresql'
 'django.db.backends.mysql'
 'django.db.backends.sqlite3'
  'django.db.backends.oracle'

使用sqlite

(2). 创建数据库模型

本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄
图书表结构设计: 表名: Book

图书名称: title
图书发布时间: pub_date

英雄表结构设计: 表名: Hero

英雄姓名: name
英雄性别: gender
英雄简介: hcontent
所属图书: hbook

图书-英雄的关系为一对多

(3). 生成数据库表

激活模型:编辑 settings.py 文件,将应用加入到 INSTALLED_APPS 中

生成迁移文件:根据模型类生成 sql 语句

python manage.py makemigrations
产生的迁移文件如下图

生成数据库表bookApp_book,数据库表中有三列信息: id ,title ,pub_date

from django.db import models

"""
名词: 
    ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。
    这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。
一对多关系:外键写在多的一端
book:hero = 1:n
"""
# Create your models here.

# 类对应数据库表, 表名称默认为bookApp_book.
class Book(models.Model):
    # 属性对应数据库表的列名,默认会添加id这一列。
    name = models.CharField(max_length=40, verbose_name="书籍名称")
    pub_date = models.DateField(verbose_name="出版日期")

    # 魔术方法,字符串友好展示, 便于调试代码
    def __str__(self):
        return  self.name

    class Meta:
        # 单数时显示的名称
        verbose_name = "图书管理"
        # 复数时显示的名称
        verbose_name_plural = verbose_name



"""
更多查询操作请参考网址: https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/
"""
# 类对应数据库表, 表名称默认为bookApp_hero.
class Hero(models.Model):
    # 属性对应数据库表的列名,默认会添加id这一列。
    gender_choice = [
        (1, "男"),
        (2, "女")
    ]
    name = models.CharField(max_length=20, verbose_name="人物名称")
    # 性别只能选择男(1)或者女(2)
    gender = models.IntegerField(choices=gender_choice, verbose_name="性别")  # 1, 2
    content = models.TextField(max_length=1000, verbose_name="人物描述")
    # 外键关联, 如果删除书籍时,相关hero对应的书籍设置为空。
    book_id = models.ForeignKey(Book, on_delete=models.SET_NULL,
                                null=True, verbose_name="书籍id")

    def __str__(self):
        return  self.name

    # Meta选项的更多使用请参考网址: https://docs.djangoproject.com/zh-hans/3.1/ref/models/options/
    class Meta:
        # 单数时显示的名称
        verbose_name = "人物管理"
        # 复数时显示的名称
        verbose_name_plural = verbose_name

在这里插入图片描述

加入子应用
在这里插入图片描述
生成迁移脚本

python manage.py makemigrations
执行迁移:执行 sql 语句生成数据表
python manage.py migrate
在这里插入图片描述

在这里插入图片描述

(4). 数据库模型基本操作

现在进入交互式的Python shell,并使用 Django 提供的免费API

pip install ipython
python manage.py shell

引入需要的包:

from bookApp.models import Hero, Book

查询所有图书信息:

Book.objects.all()

在这里插入图片描述

新建图书信息:

from datetime import datetime
book = Book(title="射雕英雄传", pub_date=datetime(year=1990,month=1,day=10)) 
book.save()

在这里插入图片描述
退出当前环境,重新进入

在这里插入图片描述

查找图书信息:

book = Book.objects.get(pk=1) 
book.id
book.title
book.pub_date

在这里插入图片描述
在这里插入图片描述

修改图书信息

book.title = "天龙八部"
book.save()

删除图书信息:

book.delete()

在这里插入图片描述

添加关联对象

# 书籍的创建
book = Book(title="倚天屠龙记", pub_date=datetime(year=1990,month=1,day=10))
book.save()

在这里插入图片描述

# 人物的创建
info1 = "峨眉第四代掌门人,先为峨眉派掌门灭绝师太的徒儿,颇获灭绝师太欢心并对她>青睐有加,将峨 眉派镇派之宝“蛾眉九阳功”传给了她,张无忌的追求者之一。"
info2 = "原名敏敏特穆尔,汝阳王(朝廷大将军察罕特穆尔)的女儿,封号“绍敏郡主”,>赵敏是她的汉 名,是从她的封号“绍敏郡主”而来。" 
hero1 = Hero(name="周芷若", gender=False, info=info1)
hero2 = Hero(name="赵敏", gender=False, info=info2)
hero1.Book=book
hero2.Book=book 
 hero1.save()
 hero2.save()

在这里插入图片描述 hero1.book_id = book 在save前加

获得关联集合:返回当前book对象的所有hero

book.hero_set.all()

在这里插入图片描述
查找书籍

 books = Book.objects.filter(name__contains="红")
 books = Book.objects.filter(pub_date__lt=date.today())
 books = Book.objects.exclude(name__contains="红")

在这里插入图片描述
在这里插入图片描述

有一个 Hero 存在,必须要有一个 Book 对象,提供了创建关联的数据:

book.hero_set.create(name="张无忌", gender=True, content="武当派第二代“张五侠”张翠山与天鹰教紫微堂堂主殷素素的儿子")

第四步: 启用后台Admin 站点管理

站点分为“内容发布(后台管理)”和“公共访问(前台管理)”两部分
“内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力
的工作。
因此, Django 会根据定义的模型类完全自动地生成管理模块

Django 框架中有一个非常强大的应用功能: 自动管理界面。 常被Web平台管理者使用,去管理整个
Web平台。
默认情况下,在 settings.py 配置文件中 INSTALLED_APPS 包含以下应用程序,为了后续的开发,默
认这些应用程序都是包含在里面的。
在这里插入图片描述(0)(1)(2)详细操作见前篇博客

(0). 数据库迁移

使用这些 Django 自带的应用程序,需要我们在数据库中创建一些数据表对应,然后才能使用它们。

python manage.py makemigrations
python manage.py migrate

(1). 创建管理员用户

# 按提示输入用户名、邮箱、密码
python manage.py createsuperuser
启动服务器,通过 “127.0.0.1:8000/admin” 访问,输入上面创建的用户名、密码完成登录
进入管理站点,默认可以对 groups、users 进行管理

(2). 管理界面本地化

编辑 settings.py 文件,设置编码、时区

LANGUAGE_CODE = 'zh-hans' 
TIME_ZONE = 'Asia/Shanghai'

(3). 自定义模型加入后台管理

打开bookApp/admin.py 文件,注册模型

from django.contrib import admin
from models import Book,Hero
admin.site.register([Book,Hero])

在这里插入图片描述
刷新管理页面,可以对 Book 的数据进行增删改查操作 ;
问题一: python2 版本中, 如果在 str 方法中返回中文,在修改和添加时会报 ascii 的错误
在 str() 方法中,将字符串末尾添加 “.encode(‘utf-8’)” 进行字符串编码
问题二: 后台管理时, Book管理显示的是英文,如何变成中文

在这里插入图片描述# bookApp/models.py
文件添加

   # Meta选项的更多使用请参考网址: https://docs.djangoproject.com/zh-hans/3.1/ref/models/options/
    class Meta:
        # 单数时显示的名称
        verbose_name = "人物管理"
        # 复数时显示的名称
        verbose_name_plural = verbose_name

在pycharm的terminal界面一直运行,python manage.py runserver 9999
更改文件后刷新网页即可
在这里插入图片描述

(4). 自定义管理页面

Django 提供了 admin.ModelAdmin 类
通过定义 ModelAdmin 的子类,来定义模型在 Admin 界面的显示方式

#bookApp/admin.py
from django.contrib import admin
from bookApp.models import  Book,Hero
# 自定义后台站点管理的拓展阅读: https://docs.djangoproject.com/zh-hans/3.1/ref/contrib/admin/
# Register your models here.

class HeroInline(admin.StackedInline):
    model = Hero
    extra = 3

#书籍自定义管理页面
class BookAdmin(admin.ModelAdmin):
    # 列表页展示的设置
    list_display =  ['id', 'name', 'pub_date']
    list_filter = ['pub_date']
    search_fields = ['name']
    list_display_links = ['name']
    list_per_page =  5
    inlines =  [HeroInline]
#任务自定义管理页面
class HeroAdmin(admin.ModelAdmin):
    # 列表页展示的设置
    list_display =  ['id', 'name', 'gender']
    list_filter = ['gender']
    search_fields = ['name', 'content']
    list_display_links = ['name']
    list_per_page =  5


    # 增加和编辑页的设置
    fieldsets = [('必填信息', {'fields': ['name', 'book_id']}),
                 ('选填信息', {'fields': ['gender', 'content']}), ]

#关联注册
admin.site.register(Book, BookAdmin)
admin.site.register(Hero, HeroAdmin)

列表页属性性

list_display:显示字段,可以点击列头进行排序list_display = [‘pk’, ‘title’, ‘pub_date’]
list_filter:过滤字段,过滤框会出现在右侧list_filter = [‘title’]
search_fields:搜索字段,搜索框会出现在上侧search_fields = [‘title’]
list_per_page:分页,分页框会出现在下侧list_per_page = 10

在这里插入图片描述

添加、修改页属性

fields:属性的先后顺序fields = [‘pub_date’, ‘title’]
fieldsets :属性分组, 注意: fields和fieldsets 只能设置一个.fieldsets = [(‘基础信息’, {‘fields’: [‘title’]}), (‘详细信息’, {‘fields’: [‘pub_date’]}), ]

在这里插入图片描述

关联对象
对于 Hero 模型类,有两种注册方式
方式一:与 Book 模型类相同
方式二关联注册

admin.StackedInline: 内嵌关联注册类
admin.TabularInline: 表格 关联注册类
#bookApp/admin.py
class HeroInline(admin.StackedInline):
    model = Hero
    extra = 3
class BookAdmin(admin.ModelAdmin):
    # 列表页展示的设置
    list_display =  ['id', 'name', 'pub_date']
  .....
    inlines =  [HeroInline]    

在这里插入图片描述

Django快速入门: 前台管理

第一步: URLconf 路由管理

在 Django 中,定义 URLconf 包括正则表达式、视图两部分 。
Django 使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图 。
注意:只匹配路径部分,即除去域名、参数后的字符串 。
在主配置文件中添加子配置文件,使主 urlconf 配置连接到子模块的 urlconf 配置文件

主配置文件配置如下, 已经配置过, 可以忽略此步骤:

# BookManage/urls.py
from django.contrib import admin
from django.urls import path, include
from bookApp.views import index
# 当用户访问的url地址以book开头, 请访问bookApp.urls这个url配置文件进行匹配并执行对应 的视图函数
urlpatterns = [
   path('admin/', admin.site.urls),
   path('book/', include('bookApp.urls')),
]

bookApp 子应用的子配置文件如下:

# bookApp/urls.py
from django.urls import path

from bookApp import views

urlpatterns = [
    # 当用户访问路径是book/, 执行views.index视图函数。
    path(r'', views.index, name='index'),
    # 显示书籍的详情页, 接收一个int值并赋值给id
    path(r'<int:id>/', views.detail, name='detail'),
]

第二步: 视图函数处理业务逻辑

在 Django 中,视图对WEB请求进行回应( response )。
视图接收 reqeust 请求对象作为第一个参数,包含了请求的信息 。
视图函数就是一个Python函数,被定义在 views.py 中 。
定义完成视图后,需要配置 urlconf ,否则无法处理请求。

在方法中调用模板 :

# bookApp/views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
#试图: 对用户的请求(request)进行 业务逻辑操作,最后返回给用户一个相应(response)
from bookApp.models import Book
def index(request):
    print("用户请求的路径:", request.path)
    books = Book.objects.all()
    # 返回响应信息
    # return  HttpResponse(books)
    # 渲染: 将上下文context{'books': books}填充到book/index.html代码的过程。
    return render(request, 'book/index.html', {'books': books})


def detail(request, id):
    """书籍详情页信息"""
    book = Book.objects.filter(id=id).first()
    heros = book.hero_set.all()
    return render(request, 'book/detail.html',
                  {'book': book, 'heros': heros})

第三步: 模板管理实现好看的HTML页面

作为Web 框架, Django 需要一种很便利的方法以动态地生成HTML。最常见的做法是使用模板。
模板包含所需HTML 输出的静态部分,以及一些特殊的语法,描述如何将动态内容插入。

(1) 模板引擎配置

创建模板的目录如下图:

在这里插入图片描述

#templates/book/detail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{book.name}}</h1>
<h1>{{book.pub_date}}</h1>
<h1>{{heros}}</h1>
</body>
</html>
#templates/book/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 style="color: blueviolet">图书管理系统</h1>
<ul>
    {% for book in books %}
        <li><a href="/book/{{ book.id }}/">{{ book.name }}</a></li>
    {% endfor %}
</ul>
</body>
</html>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(2) 模板语法: 变量

变量输出语法
{ { var } }

当模版引擎遇到一个变量,将计算这个变量,然后将结果输出。

变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。

当模版引擎遇到点("."),会按照下列顺序查询:

字典查询,例如: foo[“bar”]
属性或方法查询,例如: foo.bar
数字索引查询,例如: foo[bar]

如果变量不存在, 模版系统将插入’’ (空字符串)。

(3) 模板语法: 常用标签

语法
{ % tag % }

作用
在输出中创建文本。
控制循环或逻辑。
加载外部信息到模板中

for标签


{% for ... in ... %}
   循环逻辑
{% endfor %}

if标签

{% if ... %} 
 逻辑1
{% elif ... %} 
  逻辑2 
{% else %}
  逻辑3 
{% endif %}

comment标签

{% comment %} 
   多行注释
{% endcomment %}

include标签
加载模板并以标签内的参数渲染

{% include "base/left.html" %}

url :反向解析

{% url 'name' p1 p2 %}

csrf_token 标签
用于跨站请求伪造保护

{% csrf_token %}

多种html页面
直接在pycharm的页面中点击
1.标题标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>标题</h1>
<h2>标题</h2>
<h3>标题</h3>
<h4>标题</h4>
<h5>标题</h5>
<h6>标题</h6>
</body>
</html>

在这里插入图片描述

2.列表标签

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
/* 无序列表 */
<ul>
    <li>book1</li>
    <li>book2</li>
    <li>book3</li>
    <li>book4</li>
</ul>

/* 有序列表 */
<ol>
    <li>book1</li>
    <li>book2</li>
    <li>book3</li>
    <li>book4</li>
</ol>
</body>
</html>

3.图片标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<img src="cat.jpg">
</body>
</html>

4.链接标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="https://www.baidu.com">百度一下</a>
<a href="https://www.baidu.com"><img src="cat.jpg"></a>
</body>
</html>

5.表格标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{# r: row #}
<table border="1">
    <tr>
        <td>主机名</td>
        <td>IP</td>
    </tr>
    <tr>
        <td>localhost</td>
        <td>127.0.0.1</td>
    </tr>
        <tr>
        <td>server1</td>
        <td>127.0.0.1</td>
    </tr>
</table>
</body>
</html>

6.表单标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form>
    用户名: <input type="text" placeholder="username"><br/>
    密码: <input type="password" placeholder="password"><br/>
    <input type="submit" value="登录">
</form>
</body>
</html>

Django请求的生命周期

wsgi : 封装请求后交给后端的web框架( Flask、Django )。
请求中间件: 对请求进行校验或在请求对象中添加其他相关数据,例如: csrf、 request.session 。
路由匹配: 根据浏览器发送的不同 url 去匹配不同的视图函数。
视图函数: 在视图函数中进行业务逻辑的处理,可能涉及到: ORM、Templates 。
响应中间件: 对响应的数据进行处理。
wsgi : 将响应的内容发送给浏览器。

在这里插入图片描述
待更新

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值