request对象的类型是django.http.HttpRequest,常用属性如表所示:
方法 | 说明 |
---|---|
request.GET | 获取get请求数据的方法 |
request.POST | 获取post请求数据的方法 |
request.FILES | 获取文件上传请求数据的方法 |
request.method | 获取请求的方法 |
request.META | 请求的详细参数 |
request.META.OS | 请求端系统 |
request.META.HTTP_USER_AGENT | 用户请求头,返回请求浏览器版本 |
request.META.HTTP_HOST | 请求的主机 |
request.META.HTTP_REFERER | 请求的来源 |
1、创建django项目
file----> new Project
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUcKv697-1622682613559)(images/image-20210531094731138.png)]
django-admin startproject projectname
4、创建app
python manage.py startapp app01
5、 在settings.py下配置app
# django 注册app的变量位置
INSTALLED_APPS = [
# 自建app
'app01.apps.App01Config',
]
6、 在主路由下配置子路由分发
from django.urls import path, include
urlpatterns = [
path('app01/', include('app01.urls')),
]
7、 在app01下新建urls.py文件,写入以下内容
from django.urls import path
from . import views
urlpatterns = [
]
8、在app01文件夹下的models.py中写一个学生的模型类,有姓名、性别、家庭住址等字段。
class Student(models.Model):
name = models.CharField(max_length=32)
sex = models.CharField(max_length=10)
address = models.CharField(max_length=200)
def __str__(self):
return self.name
9、 生成迁移文件和执行迁移文件
python manage.py makemigrations
python manage.py migrate
10、 在admin中注册学生表
# 导入学生模型
from .models import Student
admin.site.register(Student)
11、 创建超级用户
python manage.py createsuperuser
12、 使用admin后台账号,登录 admin后台,添加几个学生信息
13、新建show_student.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
14、 在views.py中写一个函数,返回所有的学生信息
from django.shortcuts import render
from .models import Student
# Create your views here.
def show_student(request):
# 查询 所有的学生信息
# 使用all() 方法
stu_list = Student.objects.all()
# 把查询 出来的内容返回到页面中
# render(request, '模版地址', '返回时要带的参数')
return render(request, 'show_student.html', {'stu_list': stu_list})
15、 写路由,在app01下的urls.py中添加路由
from django.urls import path
from . import views
urlpatterns = [
path('show_student/', views.show_student)
]
16、 在页面中使用表格展示所有的学生信息
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>姓名</td>
<td>性别</td>
<td>地址</td>
</tr>
{# 使用for循环展示学生信息 #}
{% for stu in stu_list %}
<tr>
{# {{ }} #}
<td>{{stu.name}}</td>
<td>{{stu.sex}}</td>
<td>{{stu.address}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zefat8Z3-1622682613561)(images/image-20210530222018328.png)]
向指定的资源提交要被处理的数据;使用POST
,提交的数据保存在HTTP
协议中的消息主体部分
post
请求不会被浏览器缓存post
提交数据长度无限制post
比get
更加安全获取用户以post
形式提交的数据并保存在后台,为类字典数据,这里和request.GET
是一个东西;
在网页中,一般我们通过html
的表单进行数据的提交,POST
方式可以提交空数据
1、 新建添加学生页面
在项目下的templates文件夹中新建add_student.html, 写入form表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<form action="">
<p>姓名: <input type="text"></p>
<p>性别:
<select name="" id="">
<option value=""></option>
</select>
</p>
<p>地址: <input type="text"></p>
<input type="submit" value="添加">
</form>
</div>
</body>
</html>
2、 使用get方法返回添加页面
def add_student(request):
if request.method == 'GET':
return render(request, 'add_student.html')
3、 添加路由
from django.urls import path
from . import views
urlpatterns = [
path('add_student/', views.add_student), # 添加学生
]
4、 访问添加学生地址,返回以下页面
http://127.0.0.1:8000/app01/add_student/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJw60bIt-1622682613562)(images/image-20210530224512660.png)]
5、添加学生视图中使用post获取数据,并添加到数据库中
def add_student(request):
if request.method == 'GET':
return render(request, 'add_student.html')
elif request.method == 'POST':
# 获取网页提交的内容
print(request.POST)
"""
<QueryDict: {'csrfmiddlewaretoken': ['me9jfBJUYKXUPI6sT21UTH86sLbBBhq4vDdr3yXYkZ1Zurj8Ptdz6XIMascbg3RI'],
'name': ['董老师'], 'sex': ['男'], 'address': ['四川']}>
dict.get('key')
"""
name = request.POST.get('name')
sex = request.POST.get('sex')
address = request.POST.get('address')
print(name, sex, address)
# 添加
Student.objects.create(name=name, sex=sex, address=address)
return render(request, 'add_student.html')
6、 在html页面中实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<form action="" method="post">
{% csrf_token %}
<p>姓名: <input type="text" name="name"></p>
<p>性别:
<select name="sex" id="">
<option value="男">男</option>
<option value="女">女</option>
</select>
</p>
<p>地址: <input type="text" name="address"></p>
<input type="submit" value="添加">
</form>
</div>
</body>
</html>
input输入的内容,需要使用input当中的
name
属性来获取。
视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。
访问django路由时,响应的
可以使用django.http.HttpResponse来构造响应对象。
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
也可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码:
def show_student1(request):
# 查询 所有的学生信息
# 使用all() 方法
stu_list = Student.objects.all()
print(stu_list)
# 把查询 出来的内容返回到页面中
# render(request, '模版地址', '返回时要带的参数')
# return render(request, 'show_student.html', {'stu_list': stu_list})
stu_data = [{'id': i.pk, 'name': i.name, 'sex': i.sex, 'address': i.address} for i in stu_list]
return HttpResponse(json.dumps(stu_data, ensure_ascii=False))
def show_student2(request):
# 查询 所有的学生信息
# 使用all() 方法
stu_list = Student.objects.all()
print(stu_list)
# 把查询 出来的内容返回到页面中
# render(request, '模版地址', '返回时要带的参数')
# return render(request, 'show_student.html', {'stu_list': stu_list})
stu_data = [{'id': i.pk, 'name': i.name, 'sex': i.sex, 'address': i.address} for i in stu_list]
return JsonResponse(stu_data, safe=False, json_dumps_params={'ensure_ascii': False})
重定向
1、在models.py 下新建用户模型
class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=128)
def __str__(self):
return self.username
2、 在admin.py中进行注册,用admin后台管理添加用户
# 导入用户模型
from .models import User
admin.site.register(User)
3、在admin后台,添加用户信息
4、 写个login.html页面,进行登录
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<form action="" method="post">
{% csrf_token %}
<p>username: <input type="text" name="username"></p>
<p>password: <input type="password" name="password"></p>
<input type="submit" value="登录">
</form>
</div>
</body>
</html>
5、写个views.py,处理登录逻辑
使用get请求进行页面渲染
# 如果请求方法为get,返回登录页面
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
添加路由
from django.urls import path
from . import views
app_name = 'app01'
urlpatterns = [
path('login/', views.login), # 展示学生
]
使用post方法获取数据,并进行重定向
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
# 获取post提交的数据
print(request.POST)
username = request.POST.get('username')
password = request.POST.get('password')
# 通过用户名,过滤user对象,获取他的第一条数据.first(),用来判断用户是否存在
# filter当中:第一个username是User下面的字段,第二个username是post提交的数据变理
user_obj = User.objects.filter(username=username).first()
print('获取到的用户信息:', user_obj)
# 如果用户存在,并且密码正确
if user_obj and password == user_obj.password:
# 用户存在,并且密码正确时,跳转页面到主页
return redirect('app01:show_student')
else:
return render(request, 'login.html', {'msg': '登录失败'})
需要继承View:
from djago.views import View
导包规则:
最上面导django自带的包
中间空一行,导Python包
最下面空一行,导自已写的包
class LoginView(View):
def get(self, request):
return render(request, 'login.html')
def post(self, request):
# 获取post提交的数据
print(request.POST)
username = request.POST.get('username')
password = request.POST.get('password')
# 通过用户名,过滤user对象,获取他的第一条数据.first(),用来判断用户是否存在
# filter当中:第一个username是User下面的字段,第二个username是post提交的数据变理
user_obj = User.objects.filter(username=username).first()
print('获取到的用户信息:', user_obj)
# 如果用户存在,并且密码正确
if user_obj and password == user_obj.password:
# 用户存在,并且密码正确时,跳转页面到主页
return redirect('app01:show_student')
else:
return render(request, 'login.html', {'msg': '登录失败'})
类视图路由写法
"""
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
"""
from django.urls import path
from . import views
app_name = 'app01'
urlpatterns = [
path('login1/', views.LoginView.as_view()), # 用户登录
]