1.静态文件配置

1.静态文件:不经常变化的文件,主要针对html文件(CSS文件、js文件、img文件、第三方框架文件)。

2.django针对静态文件资源需要单独开始一个目录统一存放:static目录。该目录下如果各种类型的文件很多,还可以继续创建目录。css目录、js目录、img目录、第三方插件目录:utils目录/plugins目录/libs目录/others目录/或者可以不创(第三方框架较少的情况下)。

3.3.资源访问:我们在地址栏中之所以可以属于路由获取到相应的资源是因为程序员提前开设了资源的接口。
当我们执行以下代码:

可以看到我们在前端只能拿到标签,不能拿到样式。我们虽然在html文件当中已经拿给设置好了样式,但是由于我们没有配置静态文件资源,所以我们虽然在路由层配置了登陆函数的连接方式,但是我们没有提前开设静态文件资源的访问接口。

2.静态文件相关配置

1.如果我们想要使用static中静态文件,需要在settings中加入如下语句:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
加入之后template中的html文件中寻找static文件时可以去掉..,此时我们的页面可以使用静态文件。

"""
STATIC_URL = '/static/'是访问静态文件资源的接口前缀(通行证),通行证对了才能继续往下找对应的文件路径。settings中的接口前缀要和html中的link和script标签的前缀保持一致。
os.path.join(BASE_DIR, 'static')是存储静态文件资源的目录名称。接口前缀正确之后,会拿着后面的路径依次去列表中自上而下的查找,找到即停止。
"""
"""
当我们在访问一个网页时如果之前访问过,那么网页可能会混存下来访问过的内容,当我们再次访问时会访问到之前的网页,当我们进行如下设置,网页每一次都是真正地向后端发送请求而不是使用缓存的网页(中文:停用缓存,英文:disable cache)。
"""

2.当我们需要频繁地改STATIC_URL = '/static/'(静态资源的接口前缀)时,我们需要用以下代码替换掉之前的代码,这样即使接口前缀改动依然可以找到静态文件。
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.js' %}"></script>

3.form表单(获取客户端数据)

1.action:控制数据提交的地址。
1.1action="":数据默认发送给当前所在页面的地址。
1.2action='指定地址':数据默认发送给指定的地址。
1.3action="index/":超当前服务端的index地址提交。 2.method:控制数据提交的方法:默认是get,可以改成post。
get:向服务端索要数据,也可以携带一些额外需求,携带额外数据的方式:IP:PORT?XXX&YYY。XXX和YYY就是携带数据的方式(筛选条件)。但是不能携带敏感数据。
post:向服务端提交数据。也可以携带额外数据,携带额外数据的方试是请求体,请求体携带数据安全性较高,并且没有大小限制。
"""
当我们想要将网页的数据提交给服务端时,我们需要在input标签中指定一个name。可以看到超服务端发送的数据直接体现在了?后面(图1)。
"""

"""
但是此种方法安全性不高,用户名和密码直接暴露在地址栏。此时我们需要在
form标签中添加:method="post"(图1),将提交方式变为post。暂时我们还需要做一步操作:将settings中MIDDLEWARE中'django.middleware.csrf.CsrfViewMiddleware'代码注掉(图2),就可以将页面的数据提交给服务端。pycharm中出现以下字样说明数据已经成功提交给方服务端(图3)。
"""

4.request对象(向客户端发送信息)

1.request.methond:获取请求方式,结果是纯大写的字符串数据,结果是大写的GET/POST的字符串。通过这个关键字我们可以对请求分条件做一些判断,并且返回不同的数据:
views:
def login_func(request):
if request.method == 'GET':
return render(request, 'login.html') # 如果是get请求返回login页面
return HttpResponse('数据提交成功') # 如果是post请求则返回字符串 urls:
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index_func),
path('login/',views.login_func)
] 2.request.POST:可以直接拿到用户的提交给服务端的数据,通过下图我们可以看到,我们获取到的内容是一个Querty字典,字典的键是我们在html文件中给input标签中添加的name。

我们拿到的是一个Querty字典,但是字典的值是一个列表。但是我们也可以通过request.POST.get('键名')的方法拿到列表中最后一个数据值。

3.如果我们在html文件中将多个input标签中的那么改成一样的,那么我们获取到的值是一个列表,我们需要通过request.POST.getlist('键名')拿到这个列表。


4.当我们向服务端索要数据是,可以通过request,get的方式拿到?后面的数据,拿到的结果是一个字典。
如果字典对应的值中只有一个元素,那么可以用request.GET.get('键名')的方式拿到。如果值有多个数据,也可以通过request.GET.getall('键名')的方式获取。


根据上述内容,我们可以写一个指定用户名和密码的校验功能:
views:
def login_func(request):
if request.method == 'POST':
name = request.POST.get('username')
pwd = request.POST.get('password')
if name == 'max' and pwd == '123':
return HttpResponse('登陆成功')
return HttpResponse('用户名或密码错误')
return render(request, 'login.html') urls:
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index_func),
path('login/',views.login_func)
]

5.pycharm连接数据库

1.pycharm初次连接数据库需要按照如下操作:

6.django连接数据库

1.jango自带的sqlite3是一个小型的数据库,功能比较少,主要用于本地测试
我们实际项目中需要替换掉它: 默认配置sqlite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
} 修改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day51',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123',
'CHARSET': 'utf8'
}
} 2.当我们改好配置之后依然会报错,此时我们还需要下载一个mysqlclient模块,在终端和pycharm中下载都可以。
django1.X版本需要在项目目录下或者app目录下的__init__.py编写代码
import pymysql
pymysql.install_as_MySQLdb()
django2.X及以上都可以直接通过下载mysqlclient模块解决
pip3.8 install mysqlclient
ps:该模块windows下载问题不大 主要是mac电脑可能有问题
"""
一个Django项目可以连接多个库,但一个库只能连接一个Django项目。所以每创建一个新的Django项目最好新建一个库。
"""

7.ORM简介

ORM:ORM:对象关系映射,能够让不会SQL语句的python程序员,使用python面向对象的语法来操作数据库。
类:表
对象:一条条数据
对象点名字:数据获取字段对应的值
ORM由于高度封装了SQL 所以有时候效率较低 我们需要自己写SQL

8.ORM基本操作

1.现在models.py编写模型类:
class Girlinfo(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True) # 左边是字段名,右边是字段类型,约束条件
# name varchar(32)
name = models.CharField(max_length=32)
# age int
age = models.IntegerField()
'''每个字段后面都可以加verbose_name="名字",这个是给字段添加注释'''
2.数据库迁(将数据记在migrations),需要在pycharm中的命令行执行以下操作:
将操作代码记录下来(migrations目录):python38 manage.py makemigrations
在migrations会产生一个新的py文件,但是我们任然无法看到该表:

我们还需要在pycharm中的终端中进行以下操作,发现我们库中tables目录下多了很多表(这些表在cmd中也可以查的到):
将操作同步到数据库中:python manage.py migrate

 '''注意每次在models.py修改了与数据库相关的代码 都需要再次执行上述两步命令'''

9.ORM基本语句

1.ORM基本语句(在views中填写)
from app01 import models
1.1models.类名.objects.create(字段名=值)
1.2models.类名.objects.filter(字段名=限制条件),拿到的是一个列表套对象,列表中只有一个元素,我们通过结果[0].字段名的方式拿到值。
定义一个同归id查找员工的方式:
def search(request):
if request.method == 'POST':
id = request.POST.get('id')
empobj = models.emp.objects.filter(id=int(id))
print(empobj[0].id,empobj[0].age,empobj[0].gender,empobj[0].dep)
print(f"""
员工编号:{empobj[0].id}
员工年龄:{empobj[0].age}
员工性别:{empobj[0].gender}
员工部门:{empobj[0].dep}
""")
return render(request, 'search.html')
在后台获取到用户输入的编号之后可以的导入下结果:

	1.3models.类名.objects.filter(字段名=限制条件).update(字段名=新的值)
通过id确定用户,动态回去用户的信息修改:
def change(request):
if request.method == 'POST':
id = request.POST.get('id')
age = request.POST.get('age')
gender = request.POST.get('gender')
dep = request.POST.get('dep')
models.emp.objects.filter(id=id).update(age=age,gender=gender,dep=dep)
return HttpResponse(f'id为{id}的员工信息修改完毕')
return render(request,'change.html') 1.4models.类名.objects.filter(字段名=限制条件).delete()
通过指定的id删除信息:
def delete(request):
if request.method == 'POST':
id = request.POST.get('id')
models.emp.objects.filter(id=id).delete()
return HttpResponse(f'编号为{id}的员工删除成功')
return render(request,'delete.html')

10.ORM语句实操

编写一个可视化界面的增删改查功能:
urls:
urlpatterns = [
path('admin/', admin.site.urls),
path('register/', views.register),
path('search/', views.userlistpage),
path('edit_user/',views.edit_user),
path('delete_user/', views.delete_user)
] models:
class User(models.Model):
name = models.CharField(max_length=32, verbose_name='用户名')
age = models.IntegerField(verbose_name='年龄') views:
def register(request):
if request.method == 'POST':
name = request.POST.get('name')
age = request.POST.get('age')
userobj = models.User.objects.filter(name=name)
if userobj:
return HttpResponse(f'用户{name}已存在,无法重新注册')
models.User.objects.create(name=name,age=age)
return redirect('/search/') return render(request, 'register.html') def userlistpage(request):
userobj = models.User.objects.filter() # 1.获取所有用户对象 :<QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>, <User: User object (4)>]>
return render(request,'userlistpage.html',{'userobj':userobj}) # 2.跳转到html文件,将所有的用户对象传过去在html文件展示 def edit_user(request):
target_id = request.GET.get('edit_id')
target_obj = models.User.objects.filter(id=target_id)[0] if request.method == 'POST':
new_name = request.POST.get('name')
new_age = request.POST.get('age')
if new_name == target_obj.name and new_age == target_obj.age:
return HttpResponse('你未做任何修改,无法提交')
models.User.objects.filter(id=target_id).update(name=new_name,age=new_age)
return redirect('/search/')
return render(request,'edit.html',{'user_obj':target_obj}) def delete_user(request):
target_id = request.GET.get('delete_id')
models.User.objects.filter(id=target_id).delete()
return redirect('/search/') register.html:
<body>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">用户登陆</h1>
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
<p>姓名:
<input type="text" class="form-control" name="name">
</p>
<p>年龄:
<input type="text" class="form-control" name="age">
</p>
<input type="submit" class="btn btn-success btn-block">
</form>
</div>
</div>
</div>
</body> edit.html:
<body>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">用户修改</h1>
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
<p>姓名:
<input type="text" class="form-control" name="name" value="{{ user_obj.name }}">
</p>
<p>年龄:
<input type="text" class="form-control" name="age" value="{{ user_obj.age }}">
</p>
<input type="submit" class="btn btn-block btn-block">
</form>
</div>
</div>
</div>
</body> userlistpage.html:
<body>
<div class="container">
<div class="row">
<h1 class="text-center">数据展示页</h1>
<div class="col-md-8 col-md-offset-2">
<a href="/register/" class="btn btn-xs btn-success">添加数据</a>
<table class="table table-hover table-striped">
<thead>
<tr>
<td>ID</td>
<td>Name</td>
<td>Age</td>
<td class="text-center">Operation</td>
</tr>
</thead>
<tbody>
{% for userdata in userobj %}
<tr>
<td>{{ userdata.pk }}</td>
<td>{{ userdata.name }}</td>
<td>{{ userdata.age }}</td>
<td class="text-center">
<a href="/edit_user/?edit_id={{ userdata.pk }}" class="btn btn-warning btn-xs">修改</a>
<a href="/delete_user/?delete_id={{ userdata.pk }}" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %} </tbody>
</table>
</div>
</div>
</div>
</body>
"""
1.主键字段可以不写,ORM会自动创建一个id的主键字段。
2.在Django中注释用verbose_name=''来加。
3.pk是primary key 的缩写,可以直接用对象名.pk拿到主键。
4.form表单中能够提交数据的标签:
4.1 <input type="submit">
4.2<button></button>
"""

Django-request、django连接数据库、ORM的更多相关文章

  1. Django request对象与ORM简介

    form表单 form表单默认是以get请求提交数据的 http://127.0.0.1:8000/login/?username=admin&password=123 action参数 1. ...

  2. Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)

    Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...

  3. Django模型层之ORM

    Django模型层之ORM操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...

  4. python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)

    昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...

  5. {Django基础六之ORM中的锁和事务}一 锁 二 事务

    Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在 ...

  6. Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介

    没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...

  7. day 71 Django基础六之ORM中的锁和事务

    Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update(no ...

  8. day 58 Django基础六之ORM中的锁和事务

      Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update( ...

  9. Django框架详细介绍---ORM相关操作

    Django ORM相关操作 官方文档: https://docs.djangoproject.com/en/2.0/ref/models/querysets/ 1.必须掌握的十三个方法 <1& ...

  10. django - request.POST和request.body获取值时出现的情况

    django request.POST / request.body 当request.POST没有值 需要考虑下面两个要求 1.如果请求头中的: Content-Type: application/ ...

随机推荐

  1. SCI简介和写作顺序

    一.SCI论文组成部分简介 一篇完整的 sci 论文主要包括以下几个主要的组成部分,从前往后依次分别是 Title 就是说这个文章的标题其次是 Abstract 也就是这个文章的摘要.接下来是 Int ...

  2. Vscode连接gitee远程仓库

    Git初始化项目 1. Git的基础配置 Git的安装配置 下载地址为:http://git-scm.com/downloads 安装完第一步要做的是,设置你的用户名和邮件地址. git config ...

  3. kettel

    下载教程:(目前最高版本7.1) 1.网址:https://community.hitachivantara.com/docs/DOC-1009855 2.

  4. B-神经网络模型复杂度分析

    前言 一,模型计算量分析 卷积层 FLOPs 计算 全连接层的 FLOPs 计算 二,模型参数量分析 卷积层参数量 BN 层参数量 全连接层参数量 三,模型内存访问代价计算 卷积层 MAC 计算 四, ...

  5. vulnhub靶场渗透实战11-Deathnote

    ​网络模式,怎么方便怎么来. 靶场地址:https://download.vulnhub.com/deathnote/Deathnote.ova 这个靶机很简单.vbox装好.​ 1:主机发现,和端口 ...

  6. 漫谈计算机网络:网络层 ------ 重点:IP协议与互联网路由选择协议

    面试答不上?计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽时间和我一起多学学它 深入浅出,用你的空闲时间来探索计算机网络的硬核知识! 博主的上篇连载文章<初识图像处理技术> 图像 ...

  7. MISC相关刷题记录迁移

  8. Pycharm介绍下载指南

    Pycharm的基本介绍 PyCharm是一种Python IDE是可以帮助用户在使用Python语言开发时提高其效率的开发工具. Pycharm的官网:https://www.jetbrains.c ...

  9. base64解析爬取糗百

    一.缘由 这是我之前刚开始学习的时候爬取糗百的练习内容,主要练习的是bs64解析.虽然现在用的不是特别的多,但是当初的时候用起来还是非常的顺手的. 二.代码实现 #coding:utf-8 impor ...

  10. 如何使用 EF Core 7 批量删除数据

    在 EF Core 7 中,我们可以使用批量操作来删除多条数据.这种方式与之前的版本有所不同,本文将对比 EFCore 7 和之前版本批量删除数据的不同方式. 删除给定 ID 的数据 在 EF Cor ...