三板斧
from django.shortcuts import render,HttpResponse, redirect
HttpResponse
# 返回字符串
urls:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'login/', views.login),
def login(request):
return HttpResponse('Hello word~')
render
# 返回HTML页面,并且可以为该html传值
urls:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'login/', views.login),
url(r'reg/', views.reg),
]
def reg(request):
user_dict = {'name':'jason','pwd':123}
# return render(request,'reg.html')
# 给模板传值的方式1
# return render(request, 'reg.html',{'xxx':user_dict}) # 将user_dict传递给reg.html页面 页面上通过xxx就能够获取到该字典
# 给模板传值的方式2
return render(request,'reg.html',locals()) # 会将当前名称空间中所有的变量名全部传递给reg.html页面
# locals() 会出现效率问题,但还是要是用
redirect
# 重定向 既可以是我们自己的路径也可以是网上的路径
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'login/', views.login),
url(r'reg/', views.reg),
url(r'home/', views.home),
url(r'index/', views.index),
]
def home(request):
# return redirect('/index')
return redirect('http://www.xiaohuar.com')
def index(request):
return HttpResponse('index')
注意: 重定向的可以是自己写的,也可以是第三方的。
django返回的都是HttpResponse对象
我们写的视图函数必须得有返回值
静态文件配置
用户能够访问到的所有资源,都是程序员提前爆露好的,如果没有暴露,用户永远也访问不到。
用户能够在浏览器中输入网址访问到相应的资源,前提是后端暴露了该资源接口。
在django中如果你想让用户访问到对应的资源,我们只需要在urls.py中设置对应关系,反过来如果我没有在urls.py中开设资源 用户就永远就访问不到对应的资源。
返回给浏览器的html页面上所有的静态资源 也需要请求后端加载获取
通常我们将网站所用到的html文件全部存放在templates文件夹下
网站用到的静态资源全部存放到static文件夹下
静态文件
网站所用到的
自己写好的js
自己写好的CSS
第三方的框架 bootstrap fontwesome sweetalert
通常情况下网站所用到的静态文件资源,统一都放在static文件夹下
settings:
STATIC_URL = '/static/' # 是访问静态资源的接口前缀
"""只要你想访问静态资源 你就必须以static开头"""
# 手动配置静态文件访问资源
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
# os.path.join(BASE_DIR,'static2'),
] # (支持多个)
打开网页,F12, 自定义关闭旁边,Network, Disable cache (while DevTools is open),关闭缓存
接口前缀 动态解析
{% load static %}
<link rel="stylesheet" href="{% static'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
from表单
form是一个复杂的系统标签,其内部又可包含很多的一些输入标签
例如input 输入文本标签 checkbox 多选标签等等
form表单有几个属性我们需要注意一下
1:action属性,里面写的是url链接,接就是表单提交的地址
2:method属性,里面写的是数据提交的方式,可以写入get或者post
3:enctype属性,提交数据的编码格式
form表单中的标签的前后台交互
from表单上传文件
form表单上传文件
1.提交方式必须是post
2.需要将form标签的enctype属性由默认的urlencoded改为formdata
后端需要从request.FILES中获取上传的文件
django内部针对不同数据格式的数据 会解析到不同的方法中
request.GET
request.POST
request.FILES
form表单被我们应用在前后台交互的环节的,里面的值可以在后台通过某些key取出来
下面就来讲解不同标签取值的方法
1. input 标签
input标签我们最为常见,里面有三个属性比较重要
a. type 他是代表input的类型
b. name 他就是后台取值的依据(key)
c. val 他是我们输入的值,也是后台需要的值
然后我们根据type的类型,又可以把input进行细分
a. text 表示普通的文本,明文输入
b. password 输入的也是文本,密文输入
c. number 输入的是数字,不是数字不让输入
d. submit 提交按钮,提交form表单的内容
e. button 普通的按钮
f. radio 单选框,我们需要注意的是单选框的所有的name值必须相同
如果name不相同,就说明不在同一个选择方位,也就不存在单选,然后想要在后台取到他的值,
你必须在定义的时候给附上一个值给value,这样才能取到值
g. checkbox 复选框,内容和单选框一样
h. file 选择文件,可以选择文件提交给后台
以上基本是input的所有类型,需要注意几个点
1.取值都是通过name进行取值,所以必须给name赋值
2.文本类型想要附上初始值,直接在value中加入值就可以
3.选择框如果想要默认选中谁,那就在谁的标签中加入checked属性
2. select 标签
select标签是一个下拉框的形式让用户进行选择选项
所以select标签中必须包含option标签才能显示属性
形式为:
然后select中有全局属性name,这个name是后台又来进行取值的
每个option标签的文本内容是显示给用户看的,我们需要取的是option标签中的value属性,所以在开始必须给option的value赋值
后台通过select的name取值,直接取到的就是对应option的value
如果我们向让他默认选择某个option,可以在option标签中加入selected属性,如果都不加,默认是显示第一个
3. button 按钮标签
新出的标签,与input中type为button的按钮一样
4. textarea 文本框标签
与input中的text一样都是输入文本的,但是textarea标签没有字数的限制,并且输入框可以拖拉。
from表单 action参数可以写的形式
- 若不写 :默认朝当前地址提交
- 只写后缀/index/
- 写全路径
from表单默认朝后端提交的方式 默认是get请求
get请求携带参数的方式,是在url后面?
url ?username=admin&password=123
缺点:
- 不安全
- get请求携带的参数有大小限制
如果前期要提交post请求 就去settings中注释掉一个中间件
request对象及方法前后端数据交互
如何获取请求方式
获取post请求携带的数据
request.POST
获取get请求携带的数据:request.GET
get和post在后端获取用户数据的时候 规律是一样的
<QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
tank <class 'str'>
123 <class 'str'>
request.POST.get('username') 默认只取列列表的最后一个元素
如果你想将列表完整的取出 你必须用getlist()
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的列表取出
pycharm连接数据库(pycharm充当数据库的客户端)
点击database,添加数据库
Django连接数据库
Django自带一个小型的sqlite3数据库....该数据库功能不是很强大 尤其是对日期格式的数据 不是很兼容
Django连接MySQL
1. 配置文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # 指定数据库
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 到底是用哪个库
'USER':'root',
'PASSWORD':'root',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
}
现在已经不再使用MySQLdb模块,但是默认还是使用MySQLdb 连接数据库,所以告诉Django不要使用MySQLdb,而是改用pymysql 连接
在项目名称下边的__init__.py也可以在应用名下面的__init__.py文件中指定
import pymysql
pymysql.install_as_MySQLdb()
Django orm简介
orm对象关系映射
类 数据库的表
对象 表的记录
对象获取属性 记录的某个字段对应的值
优点: 能够让一个不会数据库操作的人也能够简单快捷的去使用数据库
缺点: 由于封装程度太高,可能会导致sql语句的执行效率变低
有时候结合项目需求可能需要你手写sql语句
注意事项:
1. django的orm不会自动帮你创建库,需要你手动指定一个django项目用一个数据库
2. 表会自动帮你创建,你只需要书写符合Django orm语法的代码即可
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()
数据库迁移(同步)命令:
-
python manage.py makemigrations # 不会创建表 仅仅是生成一个记录 将你当前的操作记录到一个小本本上(migrations文件夹)
-
python manage.py migrate # 将你的orm语句真正的迁移到(同步)到数据库中
-
只要你在models.py中修改了跟数据库相关的代码 你就必须重新开始执行上面两条命令
当你第一次执行上面两条命令的时候 django会自动创建很多张表 这些表都是django默认需要用到的表
你自己写的模型类所对应的表 表名有固定格式
应用名_表名
字段的增删改查
增:
在项目的modles文件夹下
phone = models.BigIntegerField(default=110) # 新增的字段 可以提前设置默认值
addr = models.CharField(max_length=64,null=True) # 新增的字段 可以设置为空
新增的字段
1.直接提供默认值 default
2.设置改字段可以为空 null=True
注意的是 不要轻易的注释models.py中任何跟数据库相关的代码
主要是跟数据库相关的代码 你在处理的时候一定要小心谨慎
数据的增删改查
表记录的增改查:
可以再客户端浏览器显示{# 模板语法注释 #},不能在网页显示,只能在后端显示,
数据的查:
get()
1. 条件存在的情况下,获取的直接是数据对象的本身
2. 条件不存在的情况下,会直接报错,所以不推荐使用get方法查询数据
filter()
- 条件存在的清华况下获取的是一个可以看成列表的数据,列表里面放的才是一个个数据
- 条件不存在的情况下,并不会报错,会返回一个可以看成空列表的数据
- filter括号内可以写多个参数逗号隔开这多个参数在查询的时候 是and关系
- filter的结果支持索引取值 但是不支持负数 并且不推荐你使用索引 推荐你使用它封装好的方法 first取第一个数据对象数据的增
数据的增
1. create()
1. 括号内写关键字参数的形式,创建数据
2. 该方法会有一个返回值,返回值就是当前的对象前身。
##### 2. 利用对象点方法的方式
user_obj = User(username='jason')
user_obj.save() # 将当前对象保存到数据库中
改:
def edit_user(request):
# 1.如何获取用户想要编辑的数据
edit_id = request.GET.get('edit_id')
if request.method == 'POST':
# 将用户新修改的所有的数据
username = request.POST.get("username")
password = request.POST.get("password")
"""POST中也是可以获取GET请求携带的参数"""
# 去数据库中修改对应的数据
# 方式1: models.Userinfo.objects.filter(pk=edit_id).update(username=username,password=password)# 批量更新
# 方式2: 获取当前数据对象 然后利用对象点属性的方式 先修改数据 然后调用对象方法保存
# 不推荐你使用第二种方式 效率低 挨个重新写入一遍
edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # pk能够自动帮你查询出当前表的主键字段名
edit_obj.username = username
edit_obj.password = password
edit_obj.save()
"""update方法会将filter查询出来的queryset对象中所有的数据对象全部更新"""
# 跳转到数据展示页面
return redirect('/userlist')
# 2.根据主键值去数据库中查询出当前对象 展示给用户看
edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()
# pk能够自动帮你查询出当前表的主键字段名
# 3.将查询出来的数据对象传递给前端页面 展示给用户看
return render(request,'edit_user.html',locals())
删:
def delete_user(request):
# 获取想要删除的数据id 直接删除
delete_id = request.GET.get('delete_id') models.Userinfo.objects.filter(pk=delete_id).delete() # 批量删除
return redirect('/userlist')