python Django框架快速入门教程(后台管理)


Posted in Python onJuly 21, 2021

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。

Django 是一个开放源代码的 Web 应用框架,由 Python 写成。

Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。

Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。

参考官方文档:Django官方文档https://docs.djangoproject.com/zh-hans/3.2/

下面看下python Django框架快速入门,步骤如下所示:

第一步:项目的创建与运行

第一次使用 Django ,那么你必须要照顾一些初始设置。也就是说,您需要自动生成一些建立 Django
项目的代码。
从命令行 cd 到您要存储代码的目录,然后运行以下命令:

django-admin startproject BookManage

进入项目目录,目录结构如下图:

python Django框架快速入门教程(后台管理)

 目录说明:
manage.py :一个命令行工具,可以使你用多种方式对 Django 项目进行交互
内层的目录:项目的真正的Python包
__init__.py :一个空文件,它告诉Python这个目录应该被看做一个Python包
settings.py :项目的配置
urls.py :项目的URL声明
wsgi.py :项目与 WSGI 兼容的Web服务器入口

第二步:应用的创建和使用

(1) 创建第一个应用程序

Django 自带一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不
是创建目录。
在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
创建应用的命令:

python3 manage.py startapp bookApp

应用的目录结构如下图 :

python Django框架快速入门教程(后台管理)

 (2) 编写第一个视图函数

打开文件 bookApp/views.py 并放入以下Python代码:

from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request):
return HttpResponse("图书管理系统")

(3) 路由规则

在 bookApp 目录中创建一个 URLconf ,创建一个名为 urls.py 。

# bookApp/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# 当用户访问bookApp应用的主页时, 执行视图函数index,反向根据名称获取url地址;
url(r'^$', views.index, name='index'),
]

根据配置文件 BookManage/settings 可知路由查找的主文件是 BookManage/urls.py , 因此在该文件
添加一条 url 规则:

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

include()函数允许引用其他 URLconfs 。

(4) 效果展示

启动服务器

python3 manage.py runserver

python Django框架快速入门教程(后台管理)

访问 url 地址: http:// 127.0.0.1:8000/book/ 如果看到主页内容 图书管理系统 即成功

python Django框架快速入门教程(后台管理)

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

(1). 数据库创建

MariaDB [(none)]> create database BookManage charset=utf8;

(2). 连接 MySQL 数据库配置

在 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'

在 BookManage/settings.py 文件中,通过DATABASES项进行数据库设置:

# .......
# 注释之前的sqlite数据库;
# DATABASES = {
#
'default': {
#
'ENGINE': 'django.db.backends.sqlite3',
#
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#
}
# }
# 添加新的Mysql数据库连接;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'BookManage',
'USER': 'root',
'PASSWORD': 'westos',
'HOST': 'localhost',
'PORT': '3306',
}
}
# .......
注意: Django 使用 MySQL 数据库需要安装 PyMySQL ,若已经安装请略过。
pip install pymysql

打开 BookManage/__init__.py ,写入以下代码导入 pymysql :

import pymysql
# MySQLdb只支持Python2.*,还不支持3.可以用PyMySQL代替。
pymysql.install_as_MySQLdb()

(2). 创建数据库模型

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

图书表结构设计: 表名: Book
图书名称: title
图书发布时间: pub_date
英雄表结构设计: 表名: Hero
英雄姓名: name
英雄性别: gender
英雄简介: hcontent
所属图书: hbook

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

# bookApp/models.py
from django.db import models
# Create your models here.class Book(models.Model):
# 定义属性:默认主键自增id字段可不写
title = models.CharField(max_length=20)
pub_date = models.DateTimeField()
# 定义默认输出格式
def __str__(self):
return "%d" % self.title
# 自定义对应的表名,默认表名:bookApp_book
class Meta:
db_table = "books"
class Hero(models.Model):
name = models.CharField(max_length=20)
gender = models.BooleanField()
content = models.CharField(max_length=100)
Book = models.ForeignKey('Book', on_delete=False)
def __str__(self):
return "%s" % self.name
# 自定义对应的表名,默认表名:bookApp_hero
class Meta:
db_table = "heros"

(3). 生成数据库表

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

# BookManage/settings.py
# Application definition
INSTALLED_APPS = [
# .......此处省略
'django.contrib.staticfiles',
# 新添加的app
'bookApp',
]

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

python manage.py makemigrations

产生的迁移文件如下:

python Django框架快速入门教程(后台管理)

 执行迁移:执行 sql 语句生成数据表

python manage.py migrate

 数据库中查看数据库表是否创建成功?

$ mysql -uroot -pwestos
MariaDB [(none)]> use BookManage
MariaDB [BookManage]> show tables;
MariaDB [BookManage]> desc books;
+----------+-------------+------+-----+---------+----------------+
| Field
| Type
| Null | Key | Default | Extra
|
+----------+-------------+------+-----+---------+----------------+
| id | int(11)
| title | varchar(20) | NO
| pub_date | datetime
| NO
| NO
| PRI | NULL | auto_increment |
| | NULL | |
| | NULL | |
+----------+-------------+------+-----+---------+----------------+
MariaDB [BookManage]> desc heros;
+---------+--------------+------+-----+---------+----------------+
| Field
| Type
| Null | Key | Default | Extra
|
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| gender | tinyint(1) | NO | | NULL | |
| content | varchar(100) | NO | | NULL | |
| Book_id | int(11) | MUL | NULL | |
| NO
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

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

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

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()

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

book.hero_set.all()

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

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

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

站点分为“内容发布(后台管理)”和“公共访问(前台管理)”两部分
“内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力
的工作。
因此, Django 会根据定义的模型类完全自动地生成管理模块
Django 框架中有一个非常强大的应用功能: 自动管理界面。 常被Web平台管理者使用,去管理整个
Web平台。
默认情况下,在 settings.py 配置文件中 INSTALLED_APPS 包含以下应用程序,为了后续的开发,默
认这些应用程序都是包含在里面的。

python Django框架快速入门教程(后台管理)

 (1). 数据库迁移

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

python manage.py makemigrations
python manage.py migrate

(2). 创建管理员用户

# 按提示输入用户名、邮箱、密码
python manage.py createsuperuser

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

python Django框架快速入门教程(后台管理)

 (3). 管理界面本地化

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

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

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

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

from django.contrib import admin
from models import Book
admin.site.register(Book)

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

python Django框架快速入门教程(后台管理)

# bookApp/models.py
class Book(models.Model):
# ........此处省略
# 自定义对应的表名,默认表名:bookApp_book
class Meta:
db_table = "books"
# 单数时显示的名称
verbose_name = '图书信息'
# 复数时显示的名称
verbose_name_plural = '图书信息'

python Django框架快速入门教程(后台管理)

(5). 自定义管理页面

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

# bookApp/admin.py
from django.contrib import admin
from .models import Book, Hero
# 书籍自定义管理页面
class BookAdmin(admin.ModelAdmin):
list_display = ['pk', 'title', 'pub_date']
list_filter = ['title']
search_fields = ['title']
list_per_page = 10# fields = ['pub_date', 'title']
fieldsets = [('基础信息', {'fields': ['title']}),
('详细信息', {'fields': ['pub_date']}), ]
# 人物自定义管理页面
class HeroAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'gender', 'content']
list_filter = ['name']
search_fields = ['name']
list_per_page = 10
# 关联注册
admin.site.register(Book, BookAdmin)
admin.site.register(Hero, HeroAdmin)

 列表页属性性

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

python Django框架快速入门教程(后台管理)

 添加、修改页属性

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

python Django框架快速入门教程(后台管理)

 关联对象

对于 Hero 模型类,有两种注册方式
方式一:与 Book 模型类相同
方式二:关联注册
admin.StackedInline : 内嵌关联注册类
admin.TabularInline : 表格 关联注册类

# bookApp/admin.py
# class HeroInline(admin.TabularInline):
class HeroInline(admin.StackedInline):
model = Hero
extra = 2
class BookAdmin(admin.ModelAdmin):
list_display = ['pk', 'title', 'pub_date']
# .......此处省略部分重复代码
inlines = [HeroInline]

显示效果如下:

python Django框架快速入门教程(后台管理)

 布尔值的显示

发布性别的显示不是一个直观的结果,可以使用方法进行封装
# bookApp/models.py
class Hero(models.Model):
#
.......此处省略部分重复代码
def sex(self):
if self.gender:
return
"男"
else:
return
"女"
在 admin 注册中使用 sex 代替 gender
# bookApp/admin.py
class HeroAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'sex', 'content']

 显示效果如下:

python Django框架快速入门教程(后台管理)

到此这篇关于python Django框架快速入门(后台管理)的文章就介绍到这了,更多相关python Django入门内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
手把手教你python实现SVM算法
Dec 27 Python
python之django母板页面的使用
Jul 03 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
python实现剪切功能
Jan 23 Python
深入浅析python 协程与go协程的区别
May 09 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
python文字转语音实现过程解析
Nov 12 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
Python编写nmap扫描工具
Jul 21 #Python
Django模型层实现多表关系创建和多表操作
Jul 21 #Python
Python基本数据类型之字符串str
Jul 21 #Python
Python中22个万用公式的小结
Jul 21 #Python
python字典的元素访问实例详解
Jul 21 #Python
Opencv实现二维直方图的计算及绘制
python scrapy简单模拟登录的代码分析
Jul 21 #Python
You might like
也谈php网站在线人数统计
2008/04/09 PHP
PHP 转义使用详解
2013/07/15 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
Vue和React有哪些区别
2020/09/12 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
详解Python中的元组与逻辑运算符
2015/10/13 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
python画折线图的程序
2018/07/26 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
建筑专业自我鉴定
2013/10/22 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
公路绿化方案
2014/05/12 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
情感电台广播稿
2015/08/18 职场文书
五年级作文之想象作文
2019/10/30 职场文书
Oracle 死锁的检测查询及处理
2021/09/25 Oracle