静态文件配置
'''我们将html文件默认都放在templates文件夹下我们将网站所使用的静态文件默认都放在static文件夹下'''静态文件前端已经写好了的 能够直接调用的文件网站写好的js文件网站写好的css文件网站用到的图片文件第三方前端框架....拿来可以直接用的就是静态文件'''django默认是不会创建static文件夹的,必须自己手动创建'''在一般情况下我们还要在static文件夹内做进一步的区分-static--js--css--img--其他第三方文件'''在浏览器中输入url能够看到对应的资源是因为后端提前开设了该资源的接口如果访问不到资源 那就说明后端没有开设该资源的接口'''****************************************************************当你在写django项目的时候 可能会出现后端代码修改了但是前端页面没有变化的情况1.你在同一个端口开了好几个django项目一直在跑的其实是第一个django项目2.浏览器缓存的问题settingsnetworkdisable cache 勾选上*****************************************************************STATIC_URL = /static/# 类似于访问静态文件的令牌"""如果你想要访问静态文件 你就必须以static开头"""'''在没有做任何修改的情况下,浏览器是访问不了静态文件的--->如果访问不到资源 那就说明后端没有开设该资源的接口所以就需要进行静态文件的配置将STATIC_URL和STATICFILES_DIRS配置完成后若是需要访问bootstrap-3.3.7-dist/js/bootstrap.min.js那么/static/相当于令牌取STATICFILES_DIRS列表里面从上往下依次查找bootstrap-3.3.7-dist/js/bootstrap.min.js都没有才会报错'''STATICFILES_DIRS = [os.path.join(BASE_DIR,'static'),os.path.join(BASE_DIR,'static1'),os.path.join(BASE_DIR,'static2'),]#静态文件动态解析--->如果有憨批项目经理要你改STATIC为xxx,而与之关联的有n个页面,就要一个个改,等你好不容易改完了,他又说要改成XXX,那直接给项目经理来一套两室一厅拳,而动态解析就能避免这个问题,反正项目经理无论让你把STATIC_URL改成什么名字都没关系{% load static %}<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}"><script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>####动态解析不像静态文件解析能任意改变static名字,必须是指定的名字''''xxx' is not a registered tag library. Must be one of:admin_listadmin_modifyadmin_staticadmin_urlscachei18nl10nlogstaticstaticfilestz'''# form表单默认是get请求数据http://127.0.0.1:8000/login/?username=jason&password=123"""form表单action参数1.不写 默认朝当前所在的url提交数据2.全写 指名道姓3.只写后缀 /login/"""# 在前期我们使用django提交post请求的时候 需要取配置文件中注释掉一行代码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',]
request对象方法初识
request.method # 返回请求方式 并且是全大写的字符串形式 <class 'str'>request.POST # 获取用户post请求提交的普通数据不包含文件request.POST.get() # 只获取列表最后一个元素request.POST.getlist() # 直接将列表取出request.GET # 获取用户提交的get请求数据request.GET.get() # 只获取列表最后一个元素request.GET.getlist() # 直接将列表取出'''get请求携带的数据大小是有限的 大概在4kb左右而post请求携带的数据大小没有限制'''def login(request):''':param request: 请求相关的数据对象 里面有很多简易的方法:return:'''print(request.POST)res=request.POST.getlist('hobby')print(res)# if request.method=='GET':# print('来了老弟')# return render(request,'login.html')# elif request.method=='POST':# return HttpResponse('OK,登录成功')if request.method=="POST":return HttpResponse('OK,登录成功')return render(request,'login.html')
pycharm链接数据库(MySQL)
视频链接:https://www.bilibili.com/video/BV1QE41147hU?p=720
"""三个位置查找数据库相关右侧上方database左下方database配置里面的plugins插件搜索安装再没有卸载pycharm重新装pycharm可以充当很多款数据库软件的客户端参考截图和视频操作即可需要提前创建好库"""
django链接数据库(MySQL)
#默认用的是sqlite3DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),}}# django链接MySQLDATABASES = {'default':{'ENGINE':'django.db.backends.mysql','NAME':'day60','USER':'root','PASSWORD':'toor','HOST':'127.0.0.1','PORT':'3306','CHARSET':'utf8'}}'''这个时候运行django就会报错,原因是mysqldb来连接的mysql,这个模块用起来贼麻烦,还要版本兼容问题,所以还要导pymysql模块,告诉django用pymysql不用mysqldb'''# 在项目名下的init或者任意的应用名下的init文件中书写以下代码都可以import pymysqlpymysql.install_as_MySQLdb()在使用过程中若是出现了decode报错点击到最后一行错误将decode改为encode即可解决
django ORM
'''ORM.对象关系映射作用:能够让一个不用sql语句的小白也能够通过python对面对象的代码简单快捷的操作数据库不足之处:高度封装 有些时候sql语句涉及到效率问题 所以有时候还是需要手写SQL语句'''类 表对象 字段对象属性 某个字段对应的值这个东西是写在models.py文件下的# 1 先去models.py中书写一个类class User(models.Model):# id int primary_key auto_incrementid = models.AutoField(primary_key=True)# username varchar(32)username = models.CharField(max_length=32)# password intpassword = models.IntegerField()*************************# 2 数据库迁移命令*************************python3 manage.py makemigrations 将操作记录记录到小本本上(migrations文件夹)如果出现cannot import name 'path' from 'django.urls这种情况,先检查pycharm 的 django环境,再检查本地python的django环境,一般都是本地django环境在1.x的时候才会出现报错python3 manage.py migrate 将操作真正的同步到数据库中# 只要你修改了models.py中跟数据库相关的代码 就必须重新执行上述的两条命令******************************************************************class User(models.Model):# id int primary_key auto_incrementid = models.AutoField(primary_key=True,verbose_name='主键')# username varchar(32)username = models.CharField(max_length=32,verbose_name='用户名')"""CharField必须要指定max_length参数 不指定会直接报错verbose_name该参数是所有字段都有的 就是用来对字段的解释"""# password intpassword = models.IntegerField(verbose_name='密码')class Author(models.Model):# 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段# 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段# 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写# username varchar(32)username = models.CharField(max_length=32)# password intpassword = models.IntegerField()
字段的增删改差
#字段的增加1.可以直接在终端内给出默认值2.该字段可以设置为空age = models.IntegerField(null=True)3.可以直接给字段设置默认值# 字段的修改直接修改代码然后执行数据库迁移的两条命令即可!# 字段的删直接注释对应的字段然后执行数据库迁移的两条命令即可!执行完毕之后字段对应的数据也都没有了"""在操作models.py的时候一定要细心千万不要注释一些字段执行迁移命令之前最好先检查一下自己写的代码"""# 个人建议:当你离开你的计算机之后一定要锁屏总结:增删改查反正全部在models.py内解决
数据的增删改查
#查# 查res = models.User.objects.filter(username=username)"""返回值你先看成是列表套数据对象的格式它也支持索引取值 切片操作 但是不支持负数索引它也不推荐你使用索引的方式取值user_obj = models.User.objects.filter(username=username).first()实际上你进去一看,这diao毛用的就是索引"""#查询用户表中所有的数据#方式一:data = models.User.objects.filter()方式二:user_queryset = models.User.objects.all()代码:def user_list(request):#查询数据的第一种方式data = models.User.objects.filter()# 查询数据的第二种方式user_queryset = models.User.objects.all()print(user_queryset)--->返回的均是模型表(类)print(data)--->返回的均是模型表(类)return render(request,'user_list.html',locals())# 编辑功能# 点击编辑按钮朝后端发送编辑数据的请求"""如何告诉后端用户想要编辑哪条数据?将编辑按钮所在的那一行数据的主键值发送给后端利用url问号后面携带参数的方式"""{% for user_func in user_queryset %}<tr><td>{{ user_func.id}}</td><td>{{ user_func.username }}</td><td>{{ user_func.password }}</td><td>{{ user_func.age }}</td><td><a href="" class="btn btn-primary">编辑</a><a href="" class="btn btn-danger">删除</a></td></tr>{% endfor %}# 增from app01 import modelsres = models.User.objects.create(username=username,password=password)# 返回值就是当前被创建的对象本身# 第二种增加user_obj = models.User(username=username,password=password)user_obj.save() # 保存数据#改第一种方式models.User.objects.filter(id = edit_id).update(username=username,password=password)第二种方式edit_obj = models.User.objects.filter(id=edit_id).first()edit_obj.username = usernameedit_obj.password = passwordedit_obj.save()代码:def edit_list(request):edit_id = request.GET.get('user_id')if request.method == 'POST':password = request.POST.get('password')username = request.POST.get('username')#修改数据的第一种方式# models.User.objects.filter(id = edit_id).update(username=username,password=password)#修改数据的第二种方式#先获得需要修改的对象edit_obj = models.User.objects.filter(id=edit_id).first()edit_obj.username = usernameedit_obj.password = passwordedit_obj.save()return redirect('/user_list/')return render(request,'edit_list.html',locals())html页面和那个注册页面一模一样,copy下来改一改就完了注意编辑按钮: ?后面的参数不参与路由匹配,但是后端可以获取到<a href="/edit_list/?user_id={{ user_func.id}}" class="btn btn-primary">编辑</a>#删models.User.objects.filter(id=delete_id).delete()def delect_list(request):delect_id=request.GET.get('user_id')models.User.objects.filter(id=delect_id).delete()return redirect('/user_list/')html<a href="/edit_list/?user_id={{ user_func.id}}" class="btn btn-primary">删除</a># 真正的删除功能应该需要二次确认# 删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态username password is_deletejason 123 0egon 123 1
课后练习
今日作业必做题1.整理今日考题,今日笔记,今日内容2.熟练掌握django静态文件配置、数据库链接配置,注意事项3.熟练掌握django orm大体功能4.利用django在前端页面上完成注册登陆功能有报错很正常,自己去百度,留意数据库的字段类型选做题1.编写图书管管理系统(周作业)提示:主要表(图书表,出版社表,作者表),尝试利用orm建立表关系不会写没关系,后面会讲
