[TOC]css
视图函数都必须有返回值, 而且返回值都是HttpResponse对象html
默认状况下, 全部的html文件都是放在templates文件夹内前端
用户在浏览器中输入网址能访问到对应的资源, 前提是后端提早开设了该资源的访问接口python
静态文件: 网站所使用到的提早写好的css, js, 第三方前端模块, 图片等都叫作静态资源mysql
默认状况下, 网站所用到的静态文件所有会放在static文件夹下,sql
一般状况下会在static文件夹内再创建文件夹对不一样静态文件加以区分,数据库
例如: css文件夹, js文件夹, font文件夹等,django
django中, 须要本身手动建立静态文件存放的文件夹bootstrap
禁止浏览器使用缓存: f12-->...-->Settings-->Network-->Disable cache后端
STATIC_URL = '/static/' # 访问静态资源文件接口前缀 # STATIC_URL = '/xxx/' STATICFILES_DIRS = [ # 静态资源所在文件夹路径 os.path.join(BASE_DIR, 'static'), # 将static文件里的全部资源上线到服务器 os.path.join(BASE_DIR, 'static1') ] # <script src="/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
动态绑定静态文件, 映射关系: 多<==>一<==>一
多: 动态变化的url后缀, 一: 文件夹路径, 一: 模板语法内置的static变量
{% load static %} <script src="{% static 'jQuery.3.4.1.js' %}"></script> <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>
get请求也可以携带参数
http://127.0.0.1:8000/login/?username=cql&password=123
get请求携带参数特色:
在朝后端提交post请求出现403时, 须要去配置文件中注释掉一行内容,
MIDDLEWARE-->'django.middleware.csrf.CsrfViewMiddleware', 中间件
浏览器不管发get请求仍是post请求, 都会执行django后端的视图函数
获取前端请求方式: request.method, 大写的字符串
获取用户提交的post请求的数据: request.POST, 至关于字典
''' print(request.POST) # <QueryDict: {'username': ['cql'], 'password': ['123']}> username = request.POST.get('username') password = request.POST.get('password') print(username, type(username)) # cql <class 'str'> print(password, type(password)) # 123 <class 'str'> username_lt = request.POST.getlist('username') print(username_lt, type(username_lt)) # ['cql'] <class 'list'> 用get取值, 默认只取列表最后一个元素, 若是想获取列表, 需使用getlist '''
获取用户提交的get请求的数据: request.GET, 更细粒度获取数据: request.GET.get, request.GET.getlist
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 指定数据库类型 'NAME': 'django', # 指定库的名字 'USER': 'root', # 键必须是全大写 'PASSWORD': 'Cql123456', 'HOST': '127.0.1.1', 'PORT': 3306, 'CHARSET': 'utf8' } }
在项目名或者在应用名下的__inint__
中书写代码指定
import pymysql pymysql.install_as_MySQLdb()
orm优势: 可以让不会数据库操做的人也可以简单方便的操做数据库
orm缺点: 封装程度过高, 会出现查询效率低的问题
去models.py中书写模型类
from django.db import models class User(models.Model): id = models.AutoField(primary_key=True) # 当不指定主键时, django会自动建立一个名为id的主键字段 username = models.CharField(max_length=32) # CharField字段必须指定max_length参数 password = models.CharField(max_length=64)
一个django项目对应一个数据库
数据库迁移(同步)命令
python manage.py makemigrations
, 将数据库的修改记录到app中的migrations文件夹内,相似于日志python manage.py migrate
, 将修改操做真正同步到数据库中增长新字段
''' email = models.EmailField() python manage.py makemigrations 报错: without a default # 未设置默认值 解决: 1) Provide a one-off default now # 在cmd中直接提供默认值 2) Quit, and let me add a default in models.py # 在models对应的表类中设置默认值或容许为空, email = models.EmailFieldnull=True) '''
删除字段: 在models对应的表类中直接注释掉对应的字段代码, 而后执行数据库迁移命令(谨慎使用)
def login(request): if request.method == "POST": username = request.POST.get('username') password = request.POST.get('password') # 数据库查询数据, 结果为列表套数据对象, 能够用多个and关系的关键字参数查询 data = models.User.objects.filter(username=username) if not data: return HttpResponse('当前用户不存在!') user_obj = data[0] if user_obj.password == password: return HttpResponse('登陆成功!') return HttpResponse('密码错误!') return render(request, 'login.html')
''' 1. 查询数据库中的全部数据展现到前端页面 2. 前端页面上针对不一样的数据都有编辑和删除按钮 3. 点击对应的按钮能完成对应的操做 ''' def show_user_lt(request): user_lt = models.User.objects.all() # 等价于: models.User.objects.filter() return render(request, 'show_user_lt.html', {'userLt': user_lt}) def add_user(request): # 草稿: 给用户返回一个添加页面, 而后用户输入提交, 后端获取数据, 写入数据库, 并给重定向到数据展现页 if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # create新增数据方法返回值为当前被建立的对象自己 user_obj = models.User.objects.create(username=username, password=password) # print(user_obj, user_obj.username, user_obj.password) return redirect('/show_user_lt/') # 添加成功后跳转到数据展现页 return render(request, 'add_user.html') class User(models.Model): username = models.CharField(max_length=32) # 跟数据库没有关系, 因此不须要执行数据库迁移命令 def __str__(self): return self.username # 该返回值必须是字符串类型
{# {% endfor %}#}
, 不会展现到前端, html的注释会展现到前端
def edit_user(request): """ 草稿: 返回一个编辑页面, 该页面上应该展现想要编辑的用户信息 利用get请求携带参数的方式, 获取用户想要编辑的数据的id值 将用户想要编辑的数据查询出来, 展现到编辑页面上, 供用户修改 """ edit_id = request.GET.get('edit_id') edit_obj = models.User.objects.filter(id=edit_id).first() # 不推荐索引取值 if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 修改数据方法: 批量操做, 会将filter查询出来的列表中的全部对象所有更新 models.User.objects.filter(id=edit_id).update(username=username, password=password) return redirect('/show_user_lt/') return render(request, 'edit_user.html', {'edit_obj': edit_obj})
<!--在show_user_lt页面中经过模板语法为每条数据的编辑按钮设置不一样的get请求携带参数--> <tbody> {% for user_obj in userLt %} <tr> <td> <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn">编辑</a> </td> </tr> {% endfor %} </tbody>
def delete_user(request): delete_id = request.GET.get('delete_id') # 删除数据方法: 批量操做, 会将filter查询出来的列表中的全部对象所有删除 models.User.objects.filter(id=delete_id).delete() return redirect('/show_user_lt/')