静态文件访问
不能与服务器端做动态交互的文件都是静态文件,如: 图片,css,js,音频,视频,html文件(部分)
静态文件配置
在 settings.py 中配置一下两项内容:
STATIC_URL
静态文件的访问路径,通过哪个url地址找静态文件 ,STATIC_URL = ‘/static/’
- 指定访问静态文件时是需要通过 /static/xxx或 127.0.0.1:8000/static/xxx
STATICFILES_DIRS
静态文件的在服务器端的存储位置
配置访问静态文件
1、目录、setting.py配置
# file: setting.py
# 静态文件的访问路径
STATIC_URL = '/static/'
# 静态文件的存储路径
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
[root@vm mysite2]# ls
db.sqlite3 manage.py mysite2 static templates
[root@vm mysite2]# mkdir -p static/img
使用静态文件的访问路径进行访问,访问路径: STATIC_URL = ‘/static/’
<img src="/static/img/bizhi.jpeg">
<img src="http://127.0.0.1:8000/static/img/bizhi.jpeg">
2、路由配置
# urls.py
path('test_static',views.test_static),
# views.py
def test_static(request):
return render(request, 'test_static.html')
# templates/test_static.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>静态文件的演示</title>
</head>
<body>
<img src="/static/img/bizhi.jpeg" width="300 px" height="150 px">
<img src="http://192.168.1.11:8000/static/img/bizhi.jpeg" width="300 px" height="150 px">
</body>
</html>
通过 {% static %}标签访问静态文件 了解
-
{% static %}
表示的就是静态文件访问路径
- 加载 static
{% load static %}
- 使用静态资源时
- 语法:
{% static '静态资源路径' %}
- 示例:
<img src="{% static 'images/lena.jpg' %}">
- 语法:
Django中的应用 - app
应用在Django项目中是一个独立的业务模块,可以包含自己的路由、视图、模板、模型
创建、注册应用app
# 创建应用文件夹
[root@vm mysite2]# python3 manage.py startapp music
/root/mysite2
#在settings.py里注册应用
[root@vm mysite2]# vi mysite2/settings.py
INSTALLED_APPS = [
# ....
'user', #用户信息模块
'music', #音乐模块
]
应用的结构
[root@vm mysite2]# ls music/
admin.py #应用的后台管理配置文件
apps.py #应用的属性配置文件
__init__.py #应用子包的初始化文件
migrations #文件夹,保存数据迁移的中间文件,不会动
models.py #与数据库相关的模型映射类文件
__pycache__
tests.py #应用的单元测试文件
views.py #定义视图处理函数的文件
应用的分布式路由
Django中,主路由配置文件(urls.py)可以不处理用户具体路由,主路由配置文件的可以做请求的分发(分布式请求处理)。具体的请求可以由各自的应用来进行处理
include 函数
用于分发将当前路由转到各个应用的路由配置文件的 urlpatterns 进行分布式处理
函数格式 include(‘app命字.url模块名’),子urls模块文件件里必须有urlpatterns 列表
同名文件冲突问题
#主urls.py
from django.conf.urls import include
# 分布式路由,将path为music/xxx的路由,交给music下的urls去处理
path('music/',include('music.urls')),
# music下的urls
from django.urls import path
from . import views
urlpatterns = [
# http://127.0.0.1:8000/music/index
path('index', views.index_view),
]
# music下的views.py
from django.shortcuts import render
def index_view(request):
return render(request, 'index.html')
# 主应用目录下的templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>这是主目录下的Index页面</h3>
</body>
</html>
# music应用下templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>这是music应用下的Index页面</h3>
</body>
</html>
# http://192.168.1.11:8000/music/index # 这是主目录下的Index页面,APP的未返回
更改下返回的文件名
# music下的views.py
from django.shortcuts import render
def index_view(request):
return render(request, 'index1.html')
# music应用下templates/index.html改成index1.html
# http://192.168.1.11:8000/music/index #这是music应用下的Index页面,主目录没有
应用的templates模板总结
应用内部可以配置模板目录
1,应用下手动创建 templates 文件夹
2,settings.py中确认 TEMPLATE 配置项中 的 'APP_DIRS' 值
例如 : 'APP_DIRS': True
#应用下templates 和 外层templates 都存在时,django得查找模板规则
1,优先查找外层templates目录下的模板,再查找APP的
2,按INSTALLED_APPS配置下的 应用顺序 从上到下逐层查找
#主 settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], #1、先找主的
'APP_DIRS': True, #True,打开APP查找。 2、再找APP的
INSTALLED_APPS = [
...
'music', # 3、APP从上到下,找到就返回
]
解决冲突方案
#在应用的templates,先创建与应用同名的子目录,然后在子目录下添加模板文件。 "应用名/模板名.html"
[root@vm music]# mkdir templates/music #templates创建同app同名的目录
[root@vm music]# mv templates/index1.html templates/music/index.html
# music下的views.py
from django.shortcuts import render
def index_view(request):
return render(request, 'music/index.html')
http://192.168.1.11:8000/music/index #这是music应用下的Index页面
练习:
练习:再创建一个user应用,并注册。user应用下,也创建一个index.html页面。
"user/index"路由请求,在视图函数返回页面时,使用自己的index页面。
url: index,返回主目录的index.html
url:music/index , 返回music应用下的index.html
url:user/index,返回user应用下的index.html
# 1、创建应用文件夹
[root@vm mysite2]# python3 manage.py startapp user
/root/mysite2
# 2、在settings.py里注册应用
[root@vm mysite2]# vi mysite2/settings.py
INSTALLED_APPS = [
....
'user', #用户信息模块
]
# 3、创建分布式路由
[root@vm mysite2]# vi mysite2/urls.py
...
path('user/',include('user.urls')),
# 4、创建子路由
[root@vm mysite2]# vi user/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('index', views.index_view),
]
# 5、创建子view
[root@vm mysite2]# vi user/views.py
...
def index_view(request):
return render(request, 'user/index.html')
# 6、 创建子templates/user目录 index文件
[root@vm mysite2]# mkdir -p user/templates/user
[root@vm mysite2]# vi user/templates/user/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>这是user应用下的Index页面</h3>
</body>
</html>
#反应略慢,别搞那么快。
# http://192.168.1.11:8000/user/index # 这是user应用下的Index页面
模型层
Django下配置使用 mysql 数据库
[root@vm mysite2]# apt-get install python3-dev default-libmysqlclient-dev #ubuntu
[root@vm mysite2]# yum install python3-devel mysql-devel gcc #centos
[root@vm mysite2]# yum -y install mariadb-server mariadb-client
[root@vm mysite2]# systemctl enable mariadb --now
[root@vm mysite2]# mysql
UPDATE mysql.user SET password = PASSWORD('123456') WHERE user = 'root';
FLUSH PRIVILEGES;
exit
[root@vm mysite2]# pip3 install --upgrade pip
[root@vm mysite2]# pip3 install mysqlclient
创建 和 配置数据库
[root@vm mysite2]# mysql -uroot -p123456
> create database mysite2 default charset utf8 ;
> use mysite2;
数据库的配置为mysql
sqlite 数据库配置
# file: settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
mysql 数据库配置
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite2',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
""" 数据库的后端引擎
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
'django.db.backends.postgresql'"""
模型(Models)
模型是一个Python类,它是由django.db.models.Model派生出的子类。
- 一个模型类代表数据库中的一张数据表
- 模型类中每一个类属性都代表数据库中的一个字段。
- 模型是数据交互的接口,是表示和操作数据库的方法和方式
Django 的 ORM框架
ORM(Object Relational Mapping)即对象关系映射,它是一种程序技术,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
ORM框架的作用
1. 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。
2. 根据设计的模型类生成数据库中的表格。
3. 通过简单的配置就可以进行数据库的切换。
ORM 好处:
1. 只需要面向对象编程, 不需要面向数据库编写代码.
- 对数据库的操作都转化成对类属性和方法的操作.
- 不用编写各种数据库的sql语句.
2. 实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.
- 不在关注用的是mysql、oracle...等数据库的内部细节.
- 通过简单的配置就可以轻松更换数据库, 而不需要修改代码.
ORM 缺点
1. 对于复杂业务,使用成本较高
2. 性能损耗,根据对象的操作转换成SQL语句,再根据查询的结果转化成对象, 在映射过程中有性能损失.
ORM 映射示意:
类 ---> 数据表
对象 ---> 数据行
属性 ---> 字段
模型类Models 创建
模型类需继承自django.db.models.Model
Models的语法规范
from django.db import models
class 模型类名(models.Model):
字段名 = models.字段类型(字段选项)
""" 模型类名是数据表名的一部分,建议类名首字母大写
字段名又是当前类的类属性名,此名称将作为数据表的字段名
字段类型用来映射到数据表中的字段的类型
字段选项为这些字段提供附加的参数信息 """
模型示例
此示例为添加一个 bookstore_book 数据表来存放图书馆中书目信息
添加一个 bookstore 的 app
[root@vm mysite2]# python3 manage.py startapp bookstore
[root@vm mysite2]# vi mysite2/settings.py
# file : setting.py 注册app
INSTALLED_APPS = [
...
'bookstore',
]
添加模型类
# file : bookstore/models.py
from django.db import models
class Book(models.Model):
title = models.CharField("书名", max_length=50, default='')
price = models.DecimalField('定价', max_digits=7, decimal_places=2, default=0.0)
数据库的迁移
迁移是Django同步您对模型所做更改(添加字段,删除模型等) 到您的数据库模式的方式,步骤如下:
1、生成或更新迁移文件
将每个应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中
[root@vm mysite2]# python3 manage.py makemigrations
/root/mysite2
Migrations for 'bookstore':
bookstore/migrations/0001_initial.py
- Create model Book
2、执行迁移脚本程序
执行迁移程序实现迁移。将每个应用下的migrations目录中的中间文件同步回数据库。
[root@vm mysite2]# python3 manage.py migrate
Running migrations:
...
Applying sessions.0001_initial... OK #看下数据库
**注意:**每次修改完模型类再对服务程序运行之前都需要做以上两步迁移操作
[root@vm mysite2]# mysql -uroot -p123456 -e "use mysite2;show tables;"
+----------------------------+
| Tables_in_mysite2 |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| bookstore_book |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
[root@vm mysite2]# mysql -uroot -p123456 -e "desc mysite2.bookstore_book;"
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(50) | NO | | NULL | |
| price | decimal(7,2) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
字段类型
参考文档 https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-types
BooleanField()
- 数据库类型:tinyint(1)
- 编程语言中:使用True或False来表示值
- 在数据库中:使用1或0来表示具体的值
CharField()
- 数据库类型:varchar
- 注意:
- 必须要指定max_length参数值
DateField()
- 数据库类型:date
- 作用:表示日期
- 参数:
- auto_now: 每次保存对象时,自动设置该字段为当前时间(取值:True/False)。
- auto_now_add: 当对象第一次被创建时自动设置当前时间(取值:True/False)。
- default: 设置当前时间(取值:字符串格式时间如: '2019-6-1')。
- 以上三个参数只能多选一
DateTimeField()
- 数据库类型:datetime(6)
- 作用:表示日期和时间
- 参数同DateField
DecimalField()
- 数据库类型:decimal(x,y)
- 编程语言中:使用小数表示该列的值
- 在数据库中:使用小数
- 参数:
- max_digits: 位数总数,包括小数点后的位数。 该值必须大于等于decimal_places.
- decimal_places: 小数点后的数字数量
- 示例: money=models.DecimalField(
max_digits=7,
decimal_places=2,
default=0.0)
FloatField()
- 数据库类型:double
- 编程语言中和数据库中都使用小数表示值
EmailField()
- 数据库类型:varchar
- 编程语言和数据库中使用字符串
IntegerField()
- 数据库类型:int
- 编程语言和数据库中使用整数
URLField()
- 数据库类型:varchar(200)
- 编程语言和数据库中使用字符串
ImageField()
- 数据库类型:varchar(100)
- 作用:在数据库中为了保存图片的路径
- 编程语言和数据库中使用字符串
TextField()
- 数据库类型:longtext
- 作用:表示不定长的字符数据
字段选项
文档参见https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-options
指定创建的列的额外的信息,允许出现多个字段选项,多个选项之间使用,隔开
1. primary_key
- 如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数库表不会创建id字段
2. blank
- 设置为True时,字段可以为空。设置为False时,字段是必须填写的。
3. null
- 如果设置为True,表示该列值允许为空。
- 默认为False,如果此选项为False建议加入default选项来设置默认值
4. default
- 设置所在列的默认值,如果字段选项null=False建议添加此项
5. db_index
- 如果设置为True,表示为该列增加索引
6. unique
- 如果设置为True,表示该字段在数据库中的值必须是唯一(不能重复出现的)
7. db_column
- 指定列的名称,如果不指定的话则采用属性名作为列名
8. verbose_name
- 设置此字段在admin界面上的显示名称。
示例:
# 创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
name = models.CharField(max_length=30, unique=True, null=False, db_index=True)
Meta内部类
使用内部 Meta类 来给模型赋予属性,Meta类下有很多内建的类属性,可对模型类做一些控制、
示例:
# file : bookstore/models.py
from django.db import models
class Book(models.Model):
title = models.CharField("书名", max_length=50, default='')
price = models.DecimalField('定价', max_digits=7, decimal_places=2, default=0.0)
class Meta:
db_table = 'book' #可改变当前模型类对应的表名
数据库迁移的错误处理方法
# file : bookstore/models.py #新增一行
from django.db import models
class Book(models.Model):
...
# 新增属性/字段 (要有默认值)
market_price = models.DecimalField("零售价",
max_digits=5,
decimal_places=2,
default=0.0)
pub = models.CharField("出版社", max_length=50,
default="")
$ python3 manage.py makemigrations
You are trying to add a non-nullable field 'des' to book without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option: 2 退出
错误原因
- 当对模型类新添加一个字段时可出现该错误
- 原理是 添加新字段后,数据库不知道原来已有数据对于新建字段该如何赋值,所以新增字段时,务必要添加default默认值。
处理方法:
- 选择1 则会进入到shell中,手动输入一个默认值,不建议
- 退出当前生成迁移文件的过程,自己去修改models.py, 新增加一个default=XXX 的缺省值(推荐使用)
Select an option: 2 退出
修改下。重新makemigrations
# file : bookstore/models.py #新增一行
from django.db import models
class Book(models.Model):
...
# 新增属性/字段 (要有默认值)
market_price = models.DecimalField("零售价", max_digits=5,decimal_places=2,default=0.0)
pub = models.CharField("出版社",max_length=50,default="")
[root@vm mysite2]# python3 manage.py makemigrations
[root@vm mysite2]# python3 manage.py migrate
数据库的迁移文件混乱的解决办法
1. 删除 所有 migrations 里所有的 000?_XXXX.py (`__init__.py`除外)
2. 删除 数据库,要先备份一下
- sql> drop database mywebdb;
3. 重新创建 数据库
- sql> create datebase mywebdb default charset...;
4. 重新生成migrations里所有的 000?_XXXX.py
- python3 manage.py makemigrations
5. 重新更新数据库
- python3 manage.py migrate
模型层的基本操作
基本操作包括增删改查操作,即(CRUD操作),CRUD是指在做计算处理时的增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)
管理器对象
每个继承自 models.Model 的模型类,都会有一个 objects 对象被同样继承下来。这个对象叫管理器对象
数据库的增删改查可以通过模型的管理器实现
class MyModel(models.Model):
...
MyModel.objects.create(...) # objects 是管理器对象
创建数据对象
Django 使用一种直观的方式把数据库表中的数据表示成Python 对象,创建数据中每一条记录就是创建一个数据对象
-
MyModel.objects.create(属性1=值1, 属性2=值1,…)
- 成功: 返回创建好的实体对象,失败: 抛出异常
-
创建 MyModel 实例对象,并调用 save() 进行保存 (不推荐)
obj = MyModel(属性=值,属性=值) obj.属性=值 obj.save()
使用Django shell
- 在Django提供了一个交互式的操作项目叫 Django Shell 它能够在交互模式用项目工程的代码执行相应的操作
- 利用 Django Shell 可以代替编写View的代码来进行直接操作
- 在Django Shell 下只能进行简单的操作,不能运行远程调式
启动使用方式:文章来源:https://www.toymoban.com/news/detail-733377.html
[root@vm ~]# cd mysite2/
[root@vm mysite2]# python3 manage.py shell
...
>>> from bookstore.models import Book
>>> Book.objects.create(title='java',price=50)
<Book: Book object (1)> #返回对象
# 数据库验证
[root@vm ~]# mysql -uroot -p123456 -e "select * from mysite2.bookstore_book"
+----+-------+-------+--------------+-----+
| id | title | price | market_price | pub |
+----+-------+-------+--------------+-----+
| 1 | java | 50.00 | 0.00 | |
+----+-------+-------+--------------+-----+
[root@vm mysite2]# python3 manage.py shell
...
>>> from bookstore.models import Book
>>> Book.objects.create(title='python',price=50,pub='清华')
<Book: Book object (2)>
>>> Book.objects.create(title='c++',price=100,pub='清华')
<Book: Book object (3)>
>>> Book.objects.create(title='xiyou',price=700,pub='beida')
<Book: Book object (4)>
>>> Book.objects.create(title='honglou',price=90,pub='beida')
文章来源地址https://www.toymoban.com/news/detail-733377.html
到了这里,关于pt24django教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!