朝花夕拾-Python-Django(入门篇)-学习笔记

朝花夕拾-Python-Django-学习笔记

朝花夕拾,一个老年人的学习笔记,不妥请指,感谢
学习《Django实战-PythonWeb典型模块与项目开发》张晓/著



第一篇 准备篇

第1章 Python与Web开发框架

1.1 Python简介

Python的设计理念是优雅、明确,简单,主要特点为:
1.具有解释型、交互式、面向对象这3个特征;
2.极其简单、明确的语法,关键字较少,结构简单;
3.可跨平台,在linux、windows和macOS等操作系统中能很好地运行;
4.提供所有主流的商业数据库的接口;
5.自由、开放源码的软件之一。

1.2 web开发框架基本知识

Web服务本质上是由socket(socket是一种通信机制,通过绑定IP地址和端口一个通信链,实现计算机间的通信)服务器向socket客户端提供HTTP响应,而浏览器就是一个socket客户端,他向web发出请求。
用大白话解释什么是Socket
Django本身是一个Web开发框架,他连接socket两端(服务端、客户端)进行数据交换,当然这种交换按照指定的协议进行,也就是HTTP(Hyper Text Transfer Protocol,超文本传输协议)
1.5 万字 + 40 张图解 HTTP 常见面试题(值得收藏)

1.2.1 web应用的本质

web应用主要做的事情就是发送html文件到浏览器,其核心功能则通过socket服务完成.因此,web服务器本质上是一个socket服务端,而浏览器本质上是一个socket客户端.
用代码简单说明web开发框架的运行方式

# 导入socket模块

输出结果:
socket服务开始运行......
import socket
# 建立socket服务
sk = socket.socket()
#绑定IP与端口号,这是绑定本机端口
sk.bind(('127.0.0.1',8000))
# 进行监听
sk.listen()
print('socket服务开始运行......')
while True:
    # 接收socket客户端连接
    conn,addr = sk.accept()
    # 接收socket客户端数据
    data = conn.recv(1024)
    print(data)
    # 向客户端发送消息,字符串前加字母b表示以字节形式传递
    conn.send(bytes("HTTP/1.1 200 OK\r\n\r\n",encoding='utf8'))
    # 向客户端发送消息,byte()函数把字符串转换成字节形式
    conn.send(bytes("i am socket server , so glad to see u.",encoding='utf8'))

输出结果

1.2.2 web开发框架核心功能

根据浏览器地址栏中url不同而做出不同响应,
1.定义了两个函数–index()和test(),还定义了一个列表类型的变量,列表总每项都是元组,其列出URL与函数名的对应关系。程序流程主要是:根据传入的参数(URL),读取相应的html文件,并根据占位符(本例中用两个 @ 包含一个变量名表示一个占位符,形如 @包含一个变量名表示一个占位符,形如 @包含一个变量名表示一个占位符,形如@index$@)进行替换实现网页动态显示;
2.index()函数和test()函数读取相应的html文件并进行占位符替换,同时以字节形式返回替换后的文本,进行替换的HTML文件index.html所含代码,请注意占位符的位置;
3.代码还增加了一个fun404函数来处理无对应关系的路径;
4.在while True代码块中增加了对浏览器(socket客户端)传来的消息的处理,解析出浏览器地址栏中url的路径,要正确解析路径必须了解浏览器传给socket服务端的消息格式。

import reprlib
import socket
def index(url):
    # 读取文件,并对占位符进行替换
    # with用法:在退出with代码块后自动关闭with打开的文件
    with open('index.html','r',encoding='utf-8') as f:
        rd = f.read()
        rd = rd.replace("$@index@$","index_html2024")
        # 替换后的文本以字节形式返回
        return bytes(rd,encoding='utf-8')

def test(url):
    with open('test.html','r',encoding='utf-8') as f:
        rd = f.read()
        rd = rd.replace("$@test@$","测试")
    return bytes(rd,encoding='utf-8')

def fun404(url):
    ret = "<h1>not found!</h1>"
    return bytes(ret,encoding='utf-8')
# 定义变量url_func,建立了url与函数名的对应关系
url_func = [
    ("/index/",index),
    ("/test/",test),
]
# 建立socket服务
sk = socket.socket()
# 绑定ip与端口号,这里是绑定本机端口
sk.bind(('127.0.0.1',8000))
# 进行监听
sk.listen()
print('socket服务开始运行')
while True:
    # 接收socket客户端连接
    conn,addr = sk.accept()
    data = conn.recv(1024)
    # 输出socket服务端接收的浏览器发来的消息格式
    print(data)
    if not data:
        # 如果客户端没有发送新的数据,就重新开始,不在向下执行
        # 防止后面语句对空字符进行操作而抛出异常
        continue
    # 把收到的数据由字节形式转换成字符串,一般用到的编码格式为utf8
    data_str = str(data,encoding='utf-8')
    # 以\r\n分割每一行,split内置函数为分割函数
    line = data_str.split("\r\n")
    # print(line[0])
    # 取出第一行字符串(line[0]),然后用空格再次分割字符串
    # 提示:在Django中索引从0开始
    v1 = line[0].split()
    # 取出路径,路径字符串在第2个位置上(以空格分割)
    url = v1[1]
    """
    向客户端发消息,字符串前加字母b表示以字节形式传递
    在http/1.1 200 \r\n\r\n之后的内容以http格式显示在浏览器中
    """
    conn.send(b"HTTP/1.1 200 OK \r\n\r\n")
    func = None
    """
    用for循环取出url_func中的每一项,它是由URL和函数名组成的元组向客户端发消息
    """
    for i in url_func:
        if i[0] == url:
            # 取出对应函数名
            func = i[1]
            break
        if func:
            func = func
        else:
            func = fun404
        # 函数名加上括号,表示执行函数
        rep = func(url)
        # 把函数返回的值向客户端发送
        conn.send(rep)
        conn.close()
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index页面</title>
    </head>
    <body>
        <h1>$@index$@</h1>
    </body>
</html>
1.2.3 http简单介绍

http消息格式有请求和响应两种,http请求和响应都包含header和body两部分,其中body是可选的。

1.2.4 http请求消息格式

http请求(request)消息包含请求头(header)和请求体(body),请求头每行以“\r\n”结尾,请求头第一行以空格分隔的字符串分别代表请求方法、路径、http等信息。

请求方法 路径HTTP/1.1\r\n
头字段名:值\r\n
头字段名:值\r\n
头字段名:值\r\n
...
\r\n
请求体 #请求体可有可无

1.3 python web开发框架

web开发框架的本质就是用http实现socket服务端与浏览器的通信功能,包含三部:
1.socket服务端和客户端(浏览器)收/发socket消息,按照http来解析;
2.建立url与要执行的函数的对应关系,这里的函数包含业务逻辑代码;
3.载入html文件当作模板,对其中特殊符号标识的字符串进行替换并发给浏览器显示。
python中的web框架一般实现3种核心功能:
1.收发消息(socket功能)
2.根据用户不同路径执行不同的函数
3.从html文件中取出内容,并且完成字符串的替换。
目前主流的python web开发框架主要有Django、Tornado和flask这3种
1.django是目前最流行的web开发框架之一,该框架包含以上3中核心功能中的第二、第三种功能,这两种功能可以很容易的通过代码或配置来实现,第一种功能使用第三方工具来实现。Django是python中最全能的web开发框架之一,功能完备。
2.Tornado包含以上3中核心功能,但需要开发人员通过代码实现,该框架最大的特点是采用异步处理,是非阻塞式,高并发处理框架,功能强大, 可以每秒处理数以千计的连接。Tornado是实现实时web服务的理想框架,其缺点是相比于Django,诸多内容需要开发人员自己去编写。随着项目越来越大,Tornado将有越来越多的功能需要开发人员来实现。
3.Flask可以实现以上3种核心功能中的第二种功能,第一、第三种功能需要第三方工具实现,是轻量级的开发框架。Flask的特点是使用简单的核心,并使用插件扩展其他功能,因此Flask是一个面向简单需求的小型应用的微框架。

第2章 初识Django

Django的特点:
1.Django采用了MTV设计模式,即模型Model、模板Template和试图View
2.Django强调代码复用,注重组件的重用性和“可插拔性”,注重敏捷开发和DRY(Don‘t Repeat Yourself)法则
3.Django有许多功能强大的第三方插件,具有很强的可拓展性
4.Django使开发复杂的,数据库驱动的网站变得简单。

2.1 Django安装

2.1.1 安装python
2.1.2 安装python虚拟环境
2.1.3 安装Django
2.1.4 测试安装效果

2.2 Django基本知识

2.2.1 Django的开发优势

Django的开发优势非常明显:
1.功能完备:Django提供了"开箱即用"的功能,这些功能可以无缝结合在一起,并遵循一致性原则,对开发人员来说非常重要,Django有完善的ORM,强大的路由映射功能,完善的视图模板的实现,强大的缓存支持等.
2.通用:Django可以构建多种类型的网站,可以与许多客户端框架一起工作,支持并且可以提供多种格式的内容,例如html,rss(简单信息整合),json(java scripe object notation,java script 对象简谱),xml(extensible markup language,可拓展标记语言)等格式的内容.
3.安全:Django能够自动保护网站,避免许多常见的安全错误,例如要将session放在cookie中这种易受攻击的方式改变为一种安全的方式,就让cookie只包含一个密钥,实际数据存储在数据库中,并用hash()函数加密用户密码.默认情况下,Django可以防范许多漏洞,包括sql注入,跨站脚本,csrf(cross-site request forgery,夸张请求伪造),单击劫持等.
4.可移植:Django是用python编写的,Python能在许多操作系统上运行,因此用Django开发的程序不受特定服务器操作系统的限制,可以在linux,windows,macOS等操作系统上正常运行.
5.自助管理后台:Diango拥有一个强大的Django Admin管理后台,用户几乎不用写代码就拥有一个完整的后台管理页面.

2.2.2 Django的MTV设计模式简介

MVC(Model-View_Controller)设计模式的概念存在时间长,也比较流行,所谓的MVC就是把Web应用分为模型(Model),视图(View)和控制器(Crotroller)3层,他们之间以松耦合的方式连接在一起,MVC的通用解释是采用透明的的数据存取方式,然后单独划分一层来显示数据,并且加上一个控制它的层.
MVC介绍
Django遵守mvc设计模式,但他有自己的特点,其为MTV设计模型,M是数据模型(Model),T是模板文件(Template),V是视图函数(View)以及与它有密切关系的url配置
Django开发总结:Django MVT与MVC设计模式,请求过程与代码示例(附源码)
(1)数据模型:定义数据结构的类,提供数据库表管理机制,定义字段的名称,类型,字段最大值,默认值,约束条件等

from django.db import models
# 在此处编写数据模型代码
# 员工数据模型(员工数据表)
class employee(models.Model):
    # 员工姓名
    name = models.CharField(max_length=32,verbose_name='姓名')
    # 员工邮箱
    email = models.EmailField(verbose_name='邮箱')

(2)模板文件:一般是HTML格式,定义文件的结构或布局,使用占位符表示香瓜内容,通过视图函数提取数据模型的数据填充HTML文件的占位符,可以创建动态页面.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{hello}}}
</body>
</html>

(3)视图函数(包含URL配置)
视图函数:是一个处理web请求的函数,他接收http请求,经过一番处理,返回http响应,也就是视图函数接收请求后,到数据模型里拿到客户端需要的需要的数据,把数据以一定的格式传递给模板文件,然后Django把模板文件以http响应格式发送给浏览器.

# 导入http相关模块
from django.http import HttpRequest
def hello(request):
    # 前面可以有向数据模型请求数据的代码
    # 返回响应
    return HttpRequest('Hello World')

URL配置:建立URL与视图函数对应关系,相当于URL映射器,主要作用是根据浏览器(客户端)的URL,将HTTP请求重定向到响应的视图函数进行处理

from django.contrib import admin
from django.urls import path
from . import 视图函数View
urlpatterns = [
    path('admin/',admin.site.urls),
    path('hello/',视图函数View.hello)
]
2.2.3 Django的其他功能

1.表单:Django通过表单进行数据验证和处理
2.用户身份验证和权限:拥有强大安全的用户身份验证和权限系统
3.序列化数据:可以将数据序列化,支持xml及json格式
4.管理后台:Django admin管理后台为系统管理员创建,编辑和查看网站中的任何数据模型,是Django默认包含的
5.缓存机制:Django提供灵活的缓存机制,可以存储部分页面,提高响应速度.

2.2.4 Django的主要文件

Django按照MTV设计模式以松耦合的方式把不同功能分配到各个文件,这些文件"各司其职",通过代码或配置完成独立功能,并于其他文件协作
1.urls.py:是URL配置文件,是网址入口,建立URL表达式与视图函数的对应关系,建立"访问网址就是调用函数"的机制;
2.views.py:是视图函数存放模块,处理用户发出的请求,用户请求从urls.py中的配置项映射出来,逻辑代码分析用户请求后,从数据库中提取数据,向templates文件中的模板文件传送数据
3.models.py:是数据模型,定义数据表结构,是数据库操作的基础
4.form.py:是Django表单定义文件,通过表单及字段属性设置,生成页面文本框,对用户提交的数据进行验证
5.templates文件夹:模板文件是视图函数渲染改造的对象,一般是HTML文件,它与视图函数共同生成具有动态内容的网页
6.admin.py:管理后台配置文件,经过简单的配置代码,就能让后台对数据库数据进行管理
7.settings.py:Django配置文件,在文件中可设置应用程序模块,数据库类型,中间件等,可以让各应用程序共享配置内容.
8.apps.py是应用程序本身的配置文件
9.tests.py是用来编写单元测试代码的文件

2.3 Django基本开发流程

Django开发环境搭建好后,就可以进入开发流程了,开发的主要工作包含部署开发环境,创建项目和应用程序本身的,编写业务逻辑代码,建立URL与视图函数的对应关系,根据项目实际情况在settings.py文件中进行设置,做好数据库连接与操作,根据需要启动Django后台管理.

2.3.1 部署开发环境

1.安装python3.10
Python3.10+Pycharm2022.2环境搭建、pip使用

2.3.2 创建项目

在终端中输入命令行代码django-admin startproject project01 .(注意,后面的点号很重要,不加点号会在该项目目录下重新创建项目;而我们已创建项目,只需要生成项目配置文件即可,所以要加点号)
在这里插入图片描述
在这里插入图片描述
asgi.py文件:Django 3.0 ASGI 指南及其性能
db.sqlite3文件:Django中db.sqlite3 文件

2.3.3 创建应用程序

在终端中输入命令行python manage.py startapp myapp . (这里.加不加都会在project01文件下中创建myapp)
在这里插入图片描述
在这里插入图片描述

2.3.4 编写逻辑代码

按照Django约定一般先写views.py文件,就是要在views.py文件中生成一个视图函数并在其中编写代码

# 导入django的httpresponse
from django.shortcuts import HttpResponse
# Create your views here.
# 在此处编写视图函数代码 index 和 test视图模块

def index(request):
    return HttpResponse('<h1>hello world</h1>')

def test(request):
    return HttpResponse('<h1>this is a test</h1>')
2.3.5 建立URL与视图函数的对应关系

URL与视图函数的对应关系要放在urls.py文件中,对应关系以url配置项形式放在文件中的一个列表变量中.
url表达式路径只匹配网址中中域名后面的部分,如http://127.0.0.1/index/只匹配/index/

# 系统默认自带的配置
from django.contrib import admin
from django.urls import path
# 导入自定义视图函数
from myapp import views

urlpatterns = [
    # 系统默认自带的配置
    path('admin/', admin.site.urls),
    # 制定URL与视图函数的对应关系
    path('index/', views.index),
    path('test/', views.test),
]

目前已配置好url路由配置中https:127.0.0.1:8000/index的index路径跳转和视图中index函数的返回值,运行项目
在这里插入图片描述
在这里插入图片描述

2.3.6 动态加载HTML页面

在项目根目录下/project01/下新建文件夹,命名为templates,名字已约定死,然后在templates文件下新建一个html文件作为测试模板,名字为test1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试模板</title>
</head>
<body>
<!--
这是一个div元素,用于布局或包裹其他HTML元素。
align="center"是一个旧的HTML属性,用于将内容居中,
但现代的HTML标准推荐使用CSS进行样式控制。
-->
<!--
如果你在一个Web应用程序中看到这样的代码,并使用这个模板渲染实际的页面,
{{hi}}{{test}}将被实际的值所替代。例如,如果变量hi的值是"Hello",变量test的值是"World"
-->
    <div align = "center">
        <!--
        这是一个h1(一级标题)元素,其中的{{hi}}是一个模板变量,它将被替换为与其相关联的实际值。
        -->
        <h1>{{ hi }}</h1>
        <!--
        这是一个水平线元素,用于在页面上创建一条水平线。
        -->
        <hr>
        <!--
        这是一个h2(一级标题)元素,其中的{{test}}是一个模板变量,它将被替换为与其相关联的实际值。
        -->
        <h2>{{ test }}</h2>
    </div>
</body>
</html>

这个html文件的代码非常简单,用于测试,代码中的双花括号包括一个变量,称为模板变量,形如{{变量名}},注意变量名和双花括号之间前后都有空格,django模板会用传入的值替代这些变量,传值的代码写在project01/myapp/views.py中,代码如下

# 导入django的httpresponse
# 向HTML文件传递参数,一般用render()函数,代码首先要导入render
from django.shortcuts import HttpResponse,render
# Create your views here.
# 在此处编写视图函数代码 index 和 test视图模块

def index(request):
    return HttpResponse('<h1>hello world</h1>')

def test(request):
    return HttpResponse('<h1>this is a test</h1>')

def test1(request):
    hi = '你好,世界是美好的!'
    test = '这是一个测试页,动态页面正常显示,测试成功'
    return render(request,'test1.html',{'h1':hi,'test':test})

说明:
1.向html文件传递参数,一般用render()函数,代码首先要导入render.
2.最后一行代码,通过render()函数向test1.html传递模板变量(第3个参数),参数是字典类型,注意字典的key的名字一定与html文件中模板变量名一致,并用单引号括起来
模板文件test1.html文件写好后,要让Django知道文件位置,需要在settings.py重设置一下,打开/project01/setting.py,找到TEMPLATES代码块,修改DIRS值

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 添加项目中新增的templates目录路径到DIRS列表中
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },

在setting.py中BASE_DIR值为/project01/,因此DIRS的值为project01/templates/,test1.html文件正是在这个目录
在这里插入图片描述

2.3.7 配置静态文件存放位置

网页可以引用图像,音频,视频,css,java script等形式的文件,这些文件存放在一个文件夹中(静态文件夹),与2.3.6同理,要让django找到这些文件必须进行设置,首先在setting.py文件的INSTALLED_APPS代码块中要有’django.contrib.staticfiles’

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    # django默认已包含
    'django.contrib.staticfiles',
]

然后在setting.py文件中增加代码

# django默认自带
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static')
)

STATIC_URL是静态文件夹前缀,STATICFILES_DIRS中的是静态文件目录列表,我们以下面的配置做解释

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
# django默认自带
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    'C:/test1/static1/',
    'C:/test2/static2/',
    'C:/test3/static3/',
)

假如html文件中有这一句引用java script文件的语句,这个语句中src以/static开头,django在查找jquery-2.2.0.min.js这个文件时,会在 ‘C:/test1/static1/’, ‘C:/test2/static2/’,‘C:/test3/static3/’,这三个文件夹去找,所以说static_url的值/static/是一个路径前缀,一个别名,它代表着STATICFILES_DIRS配置中列出的全部文件夹.

已设置静态文件夹为os.path.join(BASE_DIR,‘static’),他的真实值就是/project01/static,因此创建一个新文件夹static,将网页要引用的静态文件或者相关文件夹保存在这里,如与bootstrap相关的css,java script文件
在这里插入图片描述

在/project01/templates文件夹下新建login.html文件,主要代码如下:

<!-- 导入静态文件相关模块以及相关设置 -->
{% load static %}
<!-- 设置浏览器用的字符集是简体中文 -->
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <link href="{% static 'bootstrap/css/boots-trap.min.css' %}" rel = "stylesheet">
    <link href="{% static 'sigin.css' %}" rel = "stylesheet">
    <link rel="stylesheet" href="{% static 'font-awesome/css/font-awesome.min.css' %}">
    <script src="{% static 'jquery-3.3.1.js'%}"></script>
    <script src="{% static 'bootstrap/js/boots-trap.min.js'%}"></script>
</head>
<body>
<div class="container">
    <form class="form-signin" method="post" action="">
        {% csrf_token %}
        <h2 class="form-signin-heading">请登录</h2>
        <p></p>  <p></p>
        <lable for="username" class="sr-only">用户名</lable>
        <input type="text" id="username" name="username" class="form-control" placeholder="用户" required autofocus>
        <p></p><p></p>
        <lable for="password" class="sr-only">密码</lable>
        <input type="password" id="password" name="password" class="form-control" placeholder="密码" required>
        <button class=" btn btn-lg btn-primary btn-block" type="submit">登录</button>
    </form>
</div>
</body>
</html>

1.{% name %}这种标签为模板标签,实现函数,代码语句相似的功能.
2.{% load static %}为HTML文件要加载的静态文件的相关位置,
3.{% csrf_token %}设计防止跨站请求伪造以及中间件的相关内容
4.重点是method属性,get请求查询数据,post提交表单及数据.

接下来编写业务页面逻辑代码,/project01/myapp/views.py,增加代码:

def login(request):
    if request.method == "GET":
        # 打开login.html页面
        return render(request,"login.html")
    elif request.method == "POST":
        # 从表单提取用户名
        username = request.POST.get('username')
        # 从表单提取密码
        password = request.POST.get('password')
        if (username == 'test' and password == '123'):
            # 用户名和密码都正确时,定向到test.html渲染的页面
            return redirect('/test1/')
        else:
            return render(request,"login.html",{'error':'用户名或密码错误'})

说明:
1.对载入的html文件进行渲染和重定向功能,代码首先导入render和redirect模块
2.代码if request.method == “GET” 判断提交方式,如果是GET,就显示登录页面,如果是POST,就接收提交数据并判断正误,如果正确就定向到测试页面.
3.注意在html文件中method值(如post,get)可以是小写,但views.py的代码中必须是大写形式
4.如果用户名test和密码123正确,网页定向到测试.用return redirect(‘/test1/’)实现

最后加上url.py的路由配置,加上url和视图函数的对应关系,在project01/project01/urls.py中编写如下代码:

# 系统默认自带的配置
from django.contrib import admin
from django.urls import path
# 导入自定义视图函数
from myapp import views

urlpatterns = [
    # 系统默认自带的配置
    path('admin/', admin.site.urls),
    # 制定URL与视图函数的对应关系
    path('index/', views.index),
    path('test/', views.test),
    path('test1/',views.test1),
    path('login/',views.login),
]

说明
1.在views.py中用到login()函数,导入views.py文件中的login()函数;
2最后测试成果,点击"运行"或python manage.py runserver
在这里插入图片描述
在这里插入图片描述

2.3.8 连接数据库

django作为面向数据的开发框架,用命令生成项目与应用程序后,项目根目录下会生成一个默认的数据库db.sqlite3
,在setting.py文件中有默认配置

DATABASES = {
    'default': {
    自带数据库引擎,指明数据库类型
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR,'db.sqlite3')
    }
}

提示:django可生成数据库表,不能生成数据库,创建数据库用数据库原生命令

使用mysql.作为本例的数据库,mysql安装如下
MySQL的下载与安装
安装好后,请:
1.安装Django的mysql模块,在命令行终端上输 pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple/
2.在mysql中建立mytest数据库,用root命令登录,登录密码为123456,进入mysql管理页面或使用mysql 8.3 configurator 配置,执行create database mytest 命令建立数据库mytest
3.在settings.py中设置DATABASES代码块,将配置由sqllite3转换为mysql

DATABASES = {
    # 'default': {
    # 自带数据库引擎,指明数据库类型
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR,'db.sqlite3')
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',   # 数据库引擎,指明数据库类型
        'HOST':'127.0.0.1',  # 数据库存储在本机
        'PORT':'3306',  # 端口号
        'NAME':'mytest', # 数据库名称
        'USER':'root',   # 数据库用户名
        'PASSWORD':'123456',    # 数据库密码
    }
}

4.在/project01/myapp/model.py中建立数据表,在models.py文件中每个类生成一个数据表,这里生成一个用户信息表UserInfo,

from django.db import models
# 在此处编写数据模型代码
class UserInfo(models.Model):
    user = models.CharField(max_length=32,verbose_name='姓名')
    email = models.EmailField(verbose_name='邮箱')
    def _str_(self):
        return self.user

说明:
1).导入models模块
2).通过建立UserInfo类建立UserInfo数据表
3).__str__返回模型对象,理解为UserInfo的实例对象的别名

5.models.py中有了代码,他所属的应用程序必须在setting.py中INSTALLED_APPS注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    # django默认已包含
    'django.contrib.staticfiles',
    # 注册应用程序
    'myapp',
]

6.在项目目录/project01/project01/__init.py中编写以下代码,指明用pymysql模块替代mysqldb模块.注意大小写

import pymysql
pymysql.install_as_MySQLdb()

运行"终端"中命令行,生成数据表

python manage.py makemigrations
python manage.py migrate

makemigrations 和 migrate区分
登录navicate可以看到新生成的数据表myapp_userinfo
在这里插入图片描述
提示:django生成数据表时会把models.py中的类名转成小写,然后在前面加上应用程序的名字和下划线,如"myapp_userinfo"
以auth_和django_开发的数据表是django自动生成的系统表,后台管理系统会用到这些表.

2.3.9 django后台管理

本小姐展示了仅用少量代码迅速建立一个功能全面的后台管理网站,
注册数据库表,在project/myapp/admin.py中注册models.py生成的数据表,代码如下

from django.contrib import admin
from .models import UserInfo
# 注册数据库表
# 自定义数据模型在管理后台的显示样式
class UserInfoAdmin(admin.ModelAdmin):
    # 指明在django admin管理后台列表模式下显示哪几个字段
    list_display = ('user','email')
admin.site.register(UserInfo,UserInfoAdmin)

说明:
1.list_display表示数据列表展示时,显示哪些字段
2.admin.site.register()函数表示:如果只有一个参数,以默认方式在后台显示或管理数据表,如果有第二个参数,就按第二个参数传入的类定制的方式显示和管理数据表.
为了使后台管理系统用中文显示,在setting.py中修改LANGUAGE_CODE,TIME_ZONE两个变量,修改为

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

在"终端"命令行输入python manage.py createsuperuser ,按提示输入用户名,电子邮箱地址,密码等信息,
验证结果,输入python manage.py runserver 8000,用新建立admin和123456登录系统,看见后台管理页面
在这里插入图片描述
谢谢各位大神,Django-入门篇就到这里啦

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值