学习Django的第三课,接着前面两章的笔记,连续更新三天,后面的效率没那么高了,尽量三四天出完一课,争取在暑假可以写完Django一套体系的学习。
配置静态文件的访问路径
https://oimagea1.ydstatic.com/image?id=-5337101211608292607&product=adpublish&w=640&h=480&sc=0&rm=2&gsb=0&gsbd=60
配置静态文件的存储路径 STATICFILES_DIRS
示例:
# file: setting.py
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
使用静态文件的访问路径进行访问
<img src="/static/images/lena.jpg">
<img src="http://127.0.0.1:8000/static/images/lena.jpg">
通过 {% static %}标签访问静态文件
{% static %}
表示的就是静态文件访问路径{% load static %}
{% static '静态资源路径' %}
创建步骤
创建应用的子命令
Django应用的结构组成
migrations
文件夹
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
配置安装应用
# file : settings.py
INSTALLED_APPS = [
... ...,
'自定义应用名称'
]
INSTALLED_APPS = [
# ....
'user', # 用户信息模块
'music', # 收藏模块
]
作用:
函数格式
模块
app命字/url模块名.py
文件件里必须有urlpatterns 列表
使用前需要使用from django.conf.urls import include
导入此函数
练习:
1.创建四个应用
1.创建 index 应用,并注册
2.创建 sport 应用,并注册
3.创建 news 应用,并注册
4.创建 music 应用,并注册
2.创建分布式路由系统
主路由配置只做分发
每个应用中处理具体访问路径和视图
1. 127.0.0.1:8000/music/index
交给 music 应用中的 index_view() 函数处理
2. 127.0.0.1:8000/sport/index
交给 sport 应用中的 index_view() 函数处理
3. 127.0.0.1:8000/news/index
交给 news 应用中的 index_view() 处理处理
安装 pymysql包
$ sudo pip3 install pymysql
$ sudo pip3 install mysqlclient
创建 和 配置数据库
create database 数据库名 default charset utf8 collate utf8_general_ci;
create database mywebdb default charset utf8 collate utf8_general_ci;
# file: settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mywebdb', # 数据库名称,需要自己定义
'USER': 'root',
'PASSWORD': '123456', # 管理员密码
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
ENGINE
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
'django.db.backends.postgresql'
NAME
'NAME': 'mywebdb'
USER
'USER':'root'
PASSWORD
'PASSWORD':'123456'
HOST
'HOST':'127.0.0.1'
PORT
'PORT':'3306'
安装pymysql 模块
$ sudo pip install pymysql
修改项目中__init__.py 加入如下内容来提供pymysql引擎的支持
import pymysql
pymysql.install_as_MySQLdb()
$ python3 manage.py startapp 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)
# file : setting.py
INSTALLED_APPS = [
...
'bookstore',
]
python3 manage.py makemigrations
python3 manage.py migrate
bookstore/migrations/0001_initial.py
并进行迁移$ python3 manage.py makemigrations
$ python3 manage.py migrate
编写模型类Models
django.db.models.Model
from django.db import models
class 模型类名(models.Model):
字段名 = models.字段类型(字段选项)
模型类名是数据表名的一部分,建议类名首字母大写
字段名又是当前类的类属性名,此名称将作为数据表的字段名
字段类型用来映射到数据表中的字段的类型
字段选项为这些字段提供附加的参数信息
字段类型
BooleanField()
CharField()
DateField()
DateTimeField()
DecimalField()
数据库类型:decimal(x,y)
编程语言中:使用小数表示该列的值
在数据库中:使用小数
参数:
示例:
money=models.DecimalField(
max_digits=7,
decimal_places=2,
default=0.0
)
FloatField()
EmailField()
IntegerField()
URLField()
ImageField()
image=models.ImageField(
upload_to="static/images"
)
TextField()
字段选项FIELD_OPTIONS
# 创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
name = models.CharField(max_length=30, unique=True, null=False, db_index=True)
当执行 $ python3 manage.py makemigrations
出现如下迁移错误时的处理方法
$ python3 manage.py makemigrations
You are trying to change the nullable field 'title' on book to non-nullable 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) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration)
3) Quit, and let me add a default in models.py
Select an option:
$ python3 manage.py makemigrations
您试图将图书上的可空字段“title”更改为非空字段(没有默认值);我们不能这样做(数据库需要填充现有行)。
请选择修复:
1)现在提供一次性默认值(将对所有现有行设置此列的空值)
2)暂时忽略,让我自己处理空值的现有行(例如,因为您在以前的数据迁移中添加了RunPython或RunSQL操作来处理空值)
3)退出,让我在models.py中添加一个默认值
选择一个选项:
class Book(models.Model):
title = models.CharField("书名", max_length=50, null=True)
class Book(models.Model):
title = models.CharField("书名", max_length=50)
default=XXX
的缺省值(推荐使用)数据库的迁移文件混乱的解决办法
__init__.py
除外)class MyModel(models.Model):
...
MyModel.objects.create(...) # objects 是管理器对象
obj = MyModel(属性=值,属性=值)
obj.属性=值
obj.save()
无返回值,保存成功后,obj会被重新赋值
在Django提供了一个交互式的操作项目叫 Django Shell
它能够在交互模式用项目工程的代码执行相应的操作
利用 Django Shell 可以代替编写View的代码来进行直接操作
在Django Shell 下只能进行简单的操作,不能运行远程调式
启动方式:
$ python3 manage.py shell
练习:
在 bookstore/models.py 应用中添加两个model类
1. Book - 图书
1. title - CharField 书名,非空,唯一
2. pub - CharField 出版社,字符串,非空
3. price - 图书定价,,
4. market_price - 图书零售价
2. Author - 作者
1. name - CharField 姓名,非空
2. age - IntegerField, 年龄,非空,缺省值为1
3. email - EmailField, 邮箱,允许为空
书名 | 定价 | 零售价 | 出版社 |
---|---|---|---|
Python | 20.00 | 25.00 | 清华大学出版社 |
Python3 | 60.00 | 65.00 | 清华大学出版社 |
Django | 70.00 | 75.00 | 清华大学出版社 |
JQuery | 90.00 | 85.00 | 机械工业出版社 |
Linux | 80.00 | 65.00 | 机械工业出版社 |
Windows | 50.00 | 35.00 | 机械工业出版社 |
HTML5 | 90.00 | 105.00 | 清华大学出版社 |
姓名 | 年龄 | 邮箱 |
---|---|---|
王老师 | 28 | wangweichao@tedu.cn |
吕老师 | 31 | lvze@tedu.cn |
祁老师 | 30 | qitx@tedu.cn |
拓展:
settings.py里 APPEND_SLASH
APPEND_SLASH -> 自动补全 /
案例:
url(r’^page1/$', xx) ,访问浏览器时 地址栏输入 127.0.0.1:8000/page1 ,此时 django接到请求后
返回301【永久重定向】,并在响应头中指定重定向地址为 /page1/ ,从而出现自动补全 / 效果
若要关闭此功能,可将 APPEND_SLASH = False
出现8000端口已占用 解决方案
1,查看是否有django进程启动
ps aux|grep ‘runserver’
2,若grep中出现 相关进程,直接干!
kill -9 pid pid
案例如下:
执行 查!
tarena@tedu:~/aid1906/django/day03/mysite3$ ps aux|grep 'runserver'
tarena 13984 0.0 0.4 125980 39604 pts/0 S+ 15:39 0:00 python3 manage.py runserver
tarena 14914 1.2 0.5 202864 41312 pts/0 Sl+ 16:10 0:05 /usr/bin/python3 manage.py runserver
tarena 15056 0.0 0.0 21532 1156 pts/4 S+ 16:17 0:00 grep --color=auto runserv
#执行 干!
kill -9 13984 14914