from django.shortcuts import render,HttpResponse, redirect
HttpResponsecss
# 返回字符串 urls: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'login/', views.login), def login(request): return HttpResponse('Hello word~')
renderhtml
# 返回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对象python
咱们写的视图函数必须得有返回值mysql
用户可以访问到的全部资源,都是程序员提早爆露好的,若是没有暴露,用户永远也访问不到。程序员
用户可以在浏览器中输入网址访问到相应的资源,前提是后端暴露了该资源接口。
在django中若是你想让用户访问到对应的资源,咱们只须要在urls.py中设置对应关系,反过来若是我没有在urls.py中开设资源 用户就永远就访问不到对应的资源。
返回给浏览器的html页面上全部的静态资源 也须要请求后端加载获取
一般咱们将网站所用到的html文件所有存放在templates文件夹下
网站用到的静态资源所有存放到static文件夹下sql
网站所用到的数据库
本身写好的jsdjango
本身写好的CSSbootstrap
第三方的框架 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>
form是一个复杂的系统标签,其内部又可包含不少的一些输入标签
例如input 输入文本标签 checkbox 多选标签等等
form表单有几个属性咱们须要注意一下
1:action属性,里面写的是url连接,接就是表单提交的地址
2:method属性,里面写的是数据提交的方式,能够写入get或者post
3:enctype属性,提交数据的编码格式
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表单默认朝后端提交的方式 默认是get请求
get请求携带参数的方式,是在url后面?
url ?username=admin&password=123
缺点:
若是前期要提交post请求 就去settings中注释掉一个中间件
如何获取请求方式
获取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的列表取出
点击database,添加数据库
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()
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方法查询数据
##### 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')