一。静态文件配置
在配置静态文件时,需要创建一个文件夹在Django项目文件夹下,名字与使用无关。
静态文件包括html等使用的不会变动的插件文件等。分为三个部分:
css文件夹 当前网站所有的样式文件
js文件 当前网站所有的js文件
img文件 当前网站所有的图片文件
其他(前端框架代码)。
1.在静态文件的调用时,不能直接在html文件夹中使用相对路径或绝对路径进行调用,因为在页面访问的时后不会获取到该插件资源,所以需要将所有静态文件暴露给访客,使得访客可以获得。
在Django中可以使用以下代码进行资源暴露:
STATIC_URL = '/static/' # 这个static不是文件夹的名字 而是接口前缀 """只要你想访问静态文件中的资源 文件路径就必须用static开头""" STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), # 真正的文件夹路径 os.path.join(BASE_DIR,'static1'), # 真正的文件夹路径 os.path.join(BASE_DIR,'static2'), # 真正的文件夹路径 os.path.join(BASE_DIR,'static3') # 真正的文件夹路径 ]
这样在html文件中调用静态文件就需要以STATIC_URL中的参数为地址头,框架会自动在STATICFILES_DIRS路径中的所有文件夹中遍历,找到该文件的资源位置。
<link rel="stylesheet" href="/xxx/bootstrap-3.3.7-dist/css/bootstrap.min.css"> <script src="/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
其中xxx可以是任意字符,只要和STATIC_URL中的地址符合即可。如果STATIC_URL中的值变动,需要对所有html中的值进行修改,如果需要一劳永逸的方法,可以使用加载静态符:
{% load static %} 静态文件接口前缀"动态解析" <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css'%}"> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js'%} "></script>
load static就是加载一个静态符号。
二。form表单提交方式.
一般的,网页提交数据的方法有两种:GET 和POST,他们取决与前端form表单中 的methon中的值。
get请求方法一般是要请求页面资源时使用,它所提交的数据会暴露在url后面,所以一般提交数据使用的都是post方法。
在django中,视图函数会接受到一个request参数,这个参数会将请求的方法返回给后端,端可以通过次方法识别请求数据的类型,因为对与请求页面来说请求方法时get而提交数据需要使用post。语法如下
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
print('1111')
print(request.POST)
return HttpResponse('收到了!')
注意,在前期学习django时,涉及到post方法的时候会报错403,为了避免这个错误,需要修改框架settings中的数据:
改成post请求之后 需要去settings文件中注释掉一个中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
request是一个对象:<WSGIRequest: POST '/login/'>
其中可以对其取值POST和GET,这两个数据类型是QueryDict,是一个类似于字典类型,可以满足字典的所有取值方法。
通过request.POST.get('参数名')来取得对应的值。取出的值是str类型
也可以通过request.POST['参数名']来获取值,但不推荐使用这个方法。
返回的是一个字典加列表的形式,因为可能出现一个参数名对应多个值的情况出现
<QueryDict: {'username': ['123'], 'password': ['123'], 'tj': ['登录']}>
如果对一个有多个值的列表使用get取值只会取到最后一个这个值,所以对于有多个值的参数使用getlist方法。取出的值类型是list。
request.GET.getlist('hobby')
三。django数据库配置。
django使用的默认数据库是sqlite,如果要使用其他数据库,需要在settingts中配置文件DATABASES,将他配置为mysql的数据库所需要的资源:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day51', 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'PASSWORD':'123', 'CHARSET':'utf8' }
而此时django使用的连接数据库的模块还是mysqldb,要让他改为pymysql进行连接,需要在项目的初始化或者app的初始化中将其修改,:
import pymysql pymysql.install_as_MySQLdb()
pycharm中也有自带的处理数据的功能:
选择mysql进行配置。第一次配置需要下载一个控件:
安装后即可使用。
四。django中的orm
之前的自制的简易orm中有以下对应关系。
表==》类
表中的记录=》类创建的对象
字段中每个记录的值=》对象中的属性
所以可以创建一个类作为一个表:
class User(models.Model): # 将id字段设置为User表主键字段 在django orm中 你可以不写主键字典 django会默认给你的表创建一个名为id的主键字段 id = models.AutoField(primary_key=True) # 一旦你自己指定了主键字段 那么django就不会自动再帮你创建了 username = models.CharField(max_length=32) # username varchar(32) CharField必须要指定max_length参数 password = models.IntegerField() # password int
其中django会自己给你定义一个主键,如果你的表中没有主键,名为id
再每次数据表变动之后都需要进行迁移(同步)命令才能更新数据库中的表。
在cmd中执行以下命令:
python3 manage.py makemigrations
仅仅是在小本本上(migrations文件夹)记录数据库的修改 并不会直接操作数据
python3 manage.py migrate
将数据库修改记录 真正同步到数据库。
每当models中的数据库相关代码改变后,就需要执行以上的代码进行修改数据库。
在控制台也有简写法:
makemigrations
migrate
五。字段的增删查改:
增
如果表被创建出来之后,后期还想添加新的字段,有两种方法。
如果直接强行添加新字段而不执行1,2操作的话,系统会出现以下提示
You are trying to add a non-nullable field 'addr' to user2 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
就是这个字段没有给定初始值,不能作为字段添加,这是为了防止原有的表中有相关数据,需要给定一个初始值,解决方法如下:
1.给行动字段设置默认值。
addr=models.CharField(max_length=32,default='China') # default该字段默认值
2.设置新的字段可以为空。
age = models.IntegerField(null=True) # 该字段允许为空
删:
删除字段 直接在models.py中注释该字段 然后重新执行两条命令即可。
注意:执行完之后 表中该字段所对应的所有的数据全部删除。
并且一般情况下 基本是不会用到真正意义上的删除。
六。数据的增删查改:
首先需要导入models模块
查:
查询所有数据:
models.User.objects.all() # 直接拿所有的数据
查询数据的方法有两种:
1:使用get方法:
user_obj = models.User.objects.get(username=username)
# select * from user where username='jason'
这种方法得出的obj就是对象本身,但是不推荐使用这个方法,当对象不存在时,会报错。
2.filter:
res = models.User.objects.filter(username=username,password=password)
filter方法拿到的是一个QUERYSet对象,而我们可以通过以下方法获取其中的sql语句:
res.query #SELECT `app01_user`.`id`, `app01_user`.`username`,
`app01_user`.`password` FROM `app01_user` WHERE (`app01_user`.`username` =
jason AND `app01_user`.`password` = 123)
其操作方法和列表相差无几,
可以支持正索引取值,不支持负索引取值。不推荐使用。
可以支持正切片,也不推荐使用。
推荐使用first方法,取出其中的第一个值:
user_obj = models.User.objects.filter(username=username).first()
其内部就是通过索引取值,当列表为空时会返回一个NONE,所以在后续的操作可以判断obj是否为空。
增:
数据有两种方式可以增加:
1.通过create函数:
models.User.objects.create(username=username,password=password)
create方法能够新增数据 并且有一个返回值。返回值就是新增的数据对象本身
2.通过创建一个对象加保存的方法。
user_obj = models.User(username=username,password=password)
user_obj.save()
推荐使用第一种方法,因为第二种方法效率太低
删:
删除功能需要获取对象中的id,所以可以在删除按钮中添加id,后端可以通过GET方法取出:
/del_user/?id={{ user.id }}
然后删除:
models.User.objects.filter(id=delete_id).delete() # delete from user where id = delete_id;
改:
和删除功能差不多,需要获取修改id,然后再对其进行修改,其中注意的是:
无论post和get都可以获取url后面的get请求。
方法1:
models.User.objects.filter(id=edit_id).update
(username=username,password=password)
filter拿到是一个列表,filter操作其实都是批量操作。
如果filter结果列表中有多个数据,那么会一次性全部修改,类似于for循环一个个修改。
方法2:
对对象中的所有字段进行修改,然后保存(不推荐使用):
edit_obj.username = username edit_obj.password = password edit_obj.save()
第二种方式会从头到尾将所有的字段全部修改一遍 效率极低。