目录css
用户可以访问的全部的资源,都是程序猿提早暴露的,若是没有暴露,用户是不能进行访问的。html
,当咱们更改django中的代码的时候,django内部会检测到咱们更改,因此会重启。django是能够自动重启的 可是有时候反应速度比较慢,也有可能在你代码没写完的时候重启了 会报错 可是不用管,修改完毕后,能够本身进行启动。前端
from django.shortcuts import render,HttpResponse,redirect HttpResponse # 返回字符串 render # 返回html页面 而且能够给该html传值 redirect # 重定向 # 既能够是咱们本身的路径也能够是网上的路径 django返回的都是HttpResponse对象
def player(request): res = HttpResponse('dfdf') print(res) return res from django.template import Template,Context def test(request): #能够直接解析html return HttpResponse("<h1>哈喽</h1>") # res = Template("<h1>{{user}}</h1>") # con = Context({"user":"json",'pwd':123}) # ret = res.render(con) # print(ret) # return HttpResponse(ret)
def sing(request): res = redirect('/login') print(res) return res
def dance(request): res = render(request, 'cuang.html') print(res) return res 能够加入参数:参数会返回cuang.html页面中,进行渲染页面 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() 会出现效率问题
2.静态文件配置 静态文件 网站所用到的 本身写好js 本身写好css 第三方的框架 bootstrap fontwesome sweetalert,elementui,layui 一般状况下 网站所用到的静态文件资源 统一都放在static文件夹下 STATIC_URL = '/static/' # 是访问静态资源的接口前缀 """只要你想访问静态资源 你就必须以static开头""" # 手动配置静态文件访问资源 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), os.path.join(BASE_DIR,'static1'), # os.path.join(BASE_DIR,'static2'), ] html中 接口前缀 动态解析,这样能够修改STATIC_URL,在html中依旧能够检测到css,js {% load static %} <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
orm对象关系映射 类 数据库的表 对象 表的记录 对象获取属性 记录的某个字段对应的值
可以让一个不会数据库操做的人 也可以简单快捷去使用数据库
python
有时候 结合项目需求 可能须要你手写sql语句jquery
1.django的orm不会自动帮你建立库,库须要你本身手动建立
表会自动帮你建立 你只须要书写符合django orm语法的代码便可git
去应用下所在的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必需要指定max_length参数 username = models.CharField(max_length=64) # 在django orm中 没有char字段 可是django 暴露给用户 能够自定义char字段 # 设置password字段 password int password = models.IntegerField()
******************************数据库迁移(同步)命令*********************************** python manage.py makemigrations # 不会建立表 仅仅是生成一个记录 将你当前的操做记录到一个小本本上(migrations文件夹) python manage.py migrate # 将你的orm语句真正的迁移到(同步)到数据库中 只要你在models.py中修改了跟数据库相关的代码 你就必须从新开始执行上面两条命令
前期你若是要提交post请求 你就去settings.py文件注释掉一个中间件 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', ]
先后端数据交互 如何获取请求方式 获取post请求携带的数据 request.POST 获取get请求携带的数据 request.GET get和post在后端获取用户数据的时候 规律是同样的 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的列表取出 如: <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}> tank <class 'str'> 123 <class 'str'> request.POST.get('username') 默认只取列列表的最后一个元素 若是你想将列表完整的取出 你必须用getlist()
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32) # 总共八位 小数占两位 price = models.DecimalField(max_digits=8,decimal_places=2) # 书和出版社是一对多的关系 外键字段键在多的一方 publish_id = models.ForeignKey(to='Publish') # to指定跟谁是外键关联的 默认关联的是表的主键字段 """ ForeignKey字段 django orm在建立表的时候 会自动给该字段添加_id后缀 """ # 书和做者是多对多的关系 外键字段建在任何一方均可以 可是 推荐你建在查询频率比较高的一方 authors = models.ManyToManyField(to='Author') """authors字段仅仅是一个虚拟字段 不会再表中展现出来 仅仅是用来告诉django orm 书籍表和做者表示多对多的关系 自动建立第三张表 """ class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=255) class Author(models.Model): name = models.CharField(max_length=32) phone = models.BigIntegerField() # 一对一字段 建在哪张表均可以 可是推荐你建在 查询频率比较高的那张表 author_detail = models.OneToOneField(to='AuthorDetail') """ OneToOneField字段 django orm在建立表的时候 会自动给该字段添加_id后缀 """ class AuthorDetail(models.Model): addr = models.CharField(max_length=255) age = models.IntegerField()
表字段的增删改查
新增的字段
1.直接提供默认值 default
2.设置改字段能够为空 null=True
注意的是 不要轻易的注释models.py中任何跟数据库相关的代码
主要是跟数据库相关的代码 你在处理的时候必定要当心谨慎sql
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) # 新增的字段 能够设置为空 def __str__(self): return '我是用户对象:%s'%self.username
get()数据库
条件不存在的状况下 会直接报错 因此不推荐你使用get方法查询数据django
filter()json
def login(request): if request.method == 'POST': username = request.POST.get("username") password = request.POST.get("password") # 先以用户名为依据查询数据 # 1.get() 当查询条件不存在的时候 会直接报错 若是存在会直接给你返回 数据对象自己 不推荐使用 # res = models.Userinfo.objects.get(username=username) # select id,username,password from userinfo where username='jason' # print(res) # print(res.username) # print(res.password) # 2.filter() 当查询条件不存在的时候 不会报错而是返回一个空 # 当条件存在的状况下 不管数据有几条返回的都是列表套对象的数据格式 # filter能够当多个查询条件 而且是and关系 res = models.Userinfo.objects.filter(username=username) # select * from userinfo where username='jason' and password=123; # user_obj = res[0] # user_obj = res[0:3] # user_obj = res[-1] # 你能够将filter查询出来的结果当作列表去对待 支持正数的索引取值和切片 不支持负数 user_obj = res.first() # 取queryset第一个元素 print(user_obj) return render(request,'login.html')
create()
括号内些关键字参数的形式 建立数据
该方法会有一个返回值 返回值就是当前对象自己
利用对象点方法的方式
user_obj = User(username='jason')
user_obj.save() # 将当前对象保存到数据库中
def reg(request): if request.method == 'POST': username = request.POST.get("username") password = request.POST.get("password") # 直接将用户名和密码写入数据库 # 方式1 # user_obj = models.Userinfo.objects.create(username=username,password=password) # insert into userinfo(username,password) values('admin','666'); # create方法会有一个返回值 返回值就是当前被建立的数据对象 # 方式2 user_obj = models.Userinfo(username=username,password=password) user_obj.save() print(user_obj) return render(request,'register.html')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h2 class="text-center">编辑页面</h2> <form action="" method="post"> username:<input type="text" class="form-control" name="username" value="{{ edit_obj.username }}"> password:<input type="text" class="form-control" name="password" value="{{ edit_obj.password }}"> <br> <input type="submit" class="btn btn-warning"> </form> </div> </div> </div> </body> </html>
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())
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> {% load static %} <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1 class="text-center">数据展现</h1> <table class="table table-hover table-striped table-bordered"> <thead> <tr > <th>主键值</th> <th>用户名</th> <th>密码</th> <th class="text-center">操做</th> </tr> </thead> <tbody> {% for user_obj in user_queryset %} <tr> <td>{{ user_obj.id }}</td> <td>{{ user_obj.username }}</td> <td>{{ user_obj.password }}</td> <td class="text-center"> <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-sm">编辑</a> <a href="/delete_user/?delete_id={{ user_obj.pk }}" class="btn btn-danger btn-sm">删除</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>
def delete_user(request): # 获取想要删除的数据id 直接删除 delete_id = request.GET.get('delete_id') models.Userinfo.objects.filter(pk=delete_id).delete() # 批量删除 return redirect('/userlist')