day58
小白必会三板斧
HttpResponse # 返回字符串
render # 返回html页面 并且可以给该html传值
redirect # 重定向
# 既可以是我们自己的路径也可以是网上的路径
django返回的都是HttpResponse对象
以登录功能为例
静态文件配置
用户能够在浏览器中输入网址访问到相应的资源
前提是后端暴露了该资源接口
在django中如果你想让用户访问到对应的资源,我们只需要
在urls.py中设置对应关系
反过来如果我没有在urls.py中开设资源 用户就永远就访问不到对应的资源
返回给浏览器的html页面上所有的静态资源 也需要请求后端加载获取
通常我们将网站所用到的html文件全部存放在templates文件夹下
网站用到的静态资源全部存放到static文件夹下
静态文件
网站自己写的
js
css
font
第三方的代码 bootstrap elementUi layui
STATIC_URL = '/static/' # 是访问静态资源的接口前缀
"""只要你想访问静态资源 你就必须以static开头"""
# 手动配置静态文件访问资源
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
# os.path.join(BASE_DIR,'static1'),
# os.path.join(BASE_DIR,'static2'),
]
静态文件路径动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
request对象
request.method # 获取前端的请求方式 并且是大写的字符串形式
请求方式
get
post
两者都能够携带数据,但是get请求携带的数据是直接拼接在url后面 不安全并且数据大小有限制
request.GET # 你就把它当成一个大字典 里面放的是get请求携带过来的数据
request.POST # 你就把它当成一个大字典 里面放的是post请求携带过来的数据
"""上面的大字典 所有的value都是一个列表"""
request.GET.get('key') # 默认取的是列表的最后一个元素 并不是直接将列表取出
request.GET.getlist('key') # 直接将value的列表取出
request.POST.get('key') # 默认取的是列表的最后一个元素 并不是直接将列表取出
request.POST.getlist('key') # 直接将value的列表取出
form表单action参数
1.不写 默认往当前地址提交
2.写后缀 /index 朝着本网站的index路径提交数据
3.写全路径 http://www.xiaohuar.com
form表单默认的提交数据方式是get请求 你可以通过method参数修改提交方式
前端获取用户输入的信息 会被存放在input/option/...标签的value属性中
pycharm连接数据库(pycharm充当数据库的客户端)
django连接数据库配置
django默认自带的一个小型的sqlite数据库 该数据库功能不是很强大 尤其是对日期格式的数据 不是很兼容
django连接MySQL有两步配置
1.settings文件中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库 MySQL postgreSQL
'NAME': 'day57', # 到底使用哪个库
'USER':'root',
'PASSWORD':'root',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
}
2.django默认使用的是mysqldb模块连接数据库 但是该模块不兼容 不推荐使用
告诉django使用pymysql模块连接数据库
在项目名的文件下的__init__文件或者应用名下的__init__文件中都可以指定
import pymysql
pymysql.install_as_MySQLdb()
django orm简介
强调 django orm并不会自动帮你创建数据库 需要你手动指定
一个django项目用一个数据库(******)
ORM对象关系映射
表创建
在应用名下的models.py中书写模型类
from django.db import models
# Create your models here.
class Userinfo(models.Model):
# 设置id字段为userinfo表的主键 id int primary key auto_increment
id = models.AutoField(primary_key=True) # 在django中 你可以不指定主键字段 django orm会自动给你当前表新建一个名为id的主键字段
# 设置username字段 username varchar(64) CharField必须要指i定max_length参数
username = models.CharField(max_length=32) # 在django orm中 没有char字段 但是django 暴露给用户 可以自定义char字段
# 设置password字段 password int
password = models.IntegerField()
# phone = models.BigIntegerField(default=110) # 新增的字段 可以提前设置默认值
# addr = models.CharField(max_length=64,null=True) # 新增的字段 可以设置为空
*****************************************数据库迁移命令************************************************
1.python manage.py makemigrations # 不会真正操作数据 只是将记录记录到小本本上(对应应用名下面的migrations文件)
2.python manage.py migrate # 真正的将记录同步到数据库中
# 当你第一次执行上面两条命令的时候 django会自动创建很多张表 这些表都是django默认需要用到的表
# 你自己写的模型类所对应的表 表名有固定格式
应用名_表名
数据操作
表字段的增删改查
新增的字段
1.直接提供默认值 default
2.设置改字段可以为空 null=True
注意的是 不要轻易的注释models.py中任何跟数据库相关的代码
主要是跟数据库相关的代码 你在处理的时候一定要小心谨慎
数据的增删改查
数据的查
get()
1.条件存在的情况下 获取的直接是数据对象本身
2.条件不存在的情况下 会直接报错 所以不推荐你使用get方法查询数据
filter()
1.条件存在的情况下 获取到的是一个可以看成列表的数据 列表里面放的才是一个个数据对象本身
2.条件不存在的情况下 并不会报错 返回的是一个可以看成空列表的数据
3.filter括号内可以写多个参数逗号隔开 这多个参数在查询的时候 是and关系
4.filter的结果支持索引取值 但是不支持负数 并且不推荐你使用索引 推荐你使用它封装好的方法 first取第一个数据对象
数据的增
1.create()
1.括号内些关键字参数的形式 创建数据
2.该方法会有一个返回值 返回值就是当前对象本身
2.利用对象点方法的方式
user_obj = User(username='jason')
user_obj.save() # 将当前对象保存到数据库中
今日内容
数据的编辑与删除
图书管理系统表设计
django请求生命周期
路由层 urls.py
路由分发
有名无名分组
反向解析
路由分发
名称空间
伪静态
虚拟环境
django1.x与django2.x的区别
JsonResponse
form表单上传文件
urls.py 路由与视图函数对应关系 >>> 路由层
无名分组与有名分组
反向解析
根据某一个东西 动态解析出一个结果 该结果可以直接访问对应的url
url(r'^test_add/', views.testadd,name='xxx')
前端解析
{% url 'xxx' %}
后端解析
from django.shortcuts import render,HttpResponse,redirect,reverse
url = reverse('xxx')
无名分组反向解析
url(r'^test_addsajdsjkahdkjasjkdh/(\d+)/', views.testadd,name='xxx'),
前端解析
<a href="{% url 'xxx' 1 %}">222</a>
后端解析
url = reverse('xxx',args=(1,))
有名分子反向解析
url(r'^test_addsajdsjkahdkjasjkdh/(?P<year>\d+)/', views.testadd,name='xxx'),
前端解析
<a href="{% url 'xxx' 1 %}">222</a>
<a href="{% url 'xxx' year=1 %}">222</a>
后端解析
url = reverse('xxx',args=(1,))
url = reverse('xxx',kwargs={'year':123})
作业:用无名分组或者有名分组+反向解析 完成数据的编辑功能
url(r'^edit_user/(\d+)/',views.edit_user,name='edit')
user_queryset = models.User.objects.all()
{% for user_obj in user_queryset %}
<td>
<a href="{% url 'edit' user_obj.pk %}">编辑</a>
<a>删除</a>
</td>
{% endfor %}
def edit(request,edit_id):
pass
注意 反向解析的别名 一定不要重复
路由分发(******)
django里面的app可以有自己的static文件,templates文件夹,urls.py(******)
项目名下面的urls.py不再做路由与视图函数对应关系
而是做一个中转站 只负责将请求分发到不同的app中
然后在app的urls.py完成路由与视图函数的对应关系
from django.conf.urls import url,include
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
名称空间(了解)
总路由
url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))
print(reverse('app01:index'))
print(reverse('app02:index'))
通常情况下 起别名的时候 前面可以加上你的应用名
伪静态
将动态网页假装成是静态的
这样做的目的是为了提高搜索引擎的SEO查询优先级
搜索在收录网站的时候 会优先收录看上去像是静态文件的资源
但是无论你怎么使用伪静态进行优化 你也干不过RMB玩家
虚拟环境
通常针对不同的项目 只会安装该项目所用的模块 用不到的一概不装
不同的项目有专门的解释器环境与之对应
每创建一个虚拟环境 就类似于重新下载了一个纯净的python解释器
虚拟环境不要创建太多个
django版本区别
django1.x
django2.x
区别1:
urls.py中1.x用的是url,而2.x用的是path
并且2.x中的path第一个不支持正则表达式,写什么就匹配什么
如果你觉得不好用,2.x里面还有re_path 这个re_path就是你1.x里面的url