Ajax实现任务管理
1. Ajax请求
浏览器向网站发送请求时:URL 和 表单 的形式提交
- GET
- POST
特点:页面会刷新
除此之外,也可以基于Ajax向后台发送请求(偷偷的发送请求,页面不会刷新)
- 依赖jQuery
- 编写Ajax代码
$.ajax({
url:"发送的地址",
type:"发送请求的方式:get/post...",
data:{
n1:123,
n2:456
},
success:function(res){
console.log(res);
}
})
1.1 GET请求
from django.shortcuts import render,HttpResponse
""" 任务列表 """
def task_list(request):
return render(request, 'task_list.html')
""" 收到客户端通过Ajax提交的GET请求并返回数据 """
def task_ajax(request):
print(request.GET)
return HttpResponse("成功了!!!")
<div class="container">
<h1>任务管理</h1>
<h3>示例1</h3>
<input type="button" class="btn btn-primary" value="点击" onclick="clickMe()"/>
</div>
<script type="text/javascript">
function clickMe() {
// console.log("点击了按钮");
$.ajax({
url: '/task/ajax/',
type: 'get',
data: {
n1: 123,
n2: 456
},
success: function (res) {
console.log(res);
}
});
}
</script>
1.2 POST请求
# 免除csrf token的认证
@csrf_exempt
def task_ajax(request):
print(request.POST)
return HttpResponse("成功了!!!")
<script type="text/javascript">
function clickMe() {
// console.log("点击了按钮");
$.ajax({
url: '/task/ajax/',
type: 'post',
data: {
n1: 123,
n2: 456
},
success: function (res) {
console.log(res);
}
});
}
</script>
方式2
<script type="text/javascript">
$(function () {
// 页面框架加载完成之后代码自动执行
bindBtn1Event();
});
function bindBtn1Event() {
$("#btn1").click(function () {
$.ajax({
url: "/task/ajax/",
type: "post",
data: {
n1: 123,
n2: 456,
},
success: function (res) {
console.log(res);
},
});
});
}
</script>
2. Ajax请求的返回值
一般都会返回JSON格式
<script type="text/javascript">
$(function () {
// 页面框架加载完成之后代码自动执行
bindBtn1Event();
});
function bindBtn1Event() {
$("#btn1").click(function () {
$.ajax({
url: "/task/ajax/",
type: "post",
data: {
n1: 123,
n2: 456,
},
dataType: "JSON",
success: function (res) {
console.log(res);
},
});
});
}
</script>
# 免除csrf token的认证
@csrf_exempt
def task_ajax(request):
print(request.POST)
data_dict = {"status": True, "data": [11,22,33,44]}
# json_str = json.dumps(data_dict)
# return HttpResponse(json_str)
return JsonResponse(data_dict)
其他提交方式示例
<div class="container">
<h1>任务管理</h1>
<h3>示例1</h3>
<input id="btn1" type="button" class="btn btn-primary" value="点击1" />
<h3>示例2</h3>
<input type="text" id="txtUser" , placeholder="用户名" />
<input type="text" id="txtAge" placeholder="年龄" />
<input id="btn2" type="button" class="btn btn-primary" value="点击2" />
<h3>示例3</h3>
<form action="#" id="form3">
<input type="text" name="user" , placeholder="用户名" />
<input type="text" name="age" placeholder="年龄" />
<input type="text" name="email" placeholder="邮箱" />
<input type="text" name="more" placeholder="介绍" />
</form>
<input id="btn3" type="button" class="btn btn-primary" value="点击3" />
</div>
<script type="text/javascript">
$(function () {
// 页面框架加载完成之后代码自动执行
bindBtn1Event();
bindBtn2Event();
bindBtn3Event();
});
function bindBtn1Event() {
$("#btn1").click(function () {
$.ajax({
url: "/task/ajax/",
type: "post",
data: {
n1: 123,
n2: 456,
},
dataType: "JSON",
success: function (res) {
console.log(res);
},
});
});
}
function bindBtn2Event() {
$("#btn2").click(function () {
$.ajax({
url: "/task/ajax/",
type: "post",
data: {
name: $("#txtUser").val(),
age: $("#txtAge").val(),
},
dataType: "JSON",
success: function (res) {
console.log(res);
},
});
});
}
function bindBtn3Event() {
$("#btn3").click(function () {
$.ajax({
url: "/task/ajax/",
type: "post",
data: $("#form3").serialize(),
dataType: "JSON",
success: function (res) {
console.log(res);
},
});
});
}
</script>
# 免除csrf token的认证
@csrf_exempt
def task_ajax(request):
print(request.POST)
data_dict = {"status": True, "data": [11,22,33,44]}
json_str = json.dumps(data_dict)
# return HttpResponse(json_str)
return JsonResponse(data_dict)
3. 案例:添加任务
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">新建任务</div>
<div class="panel-body">
<form id="formAdd">
<div class="clearfix">
{% for field in form %}
{{ field }}
{% endfor %}
<div class="col-xs-12">
<button id="btnAdd" type="button" class="btn btn-primary">
提 交
</button>
</div>
</div>
</form>
</div>
</div>
function bindBtnAddEvent() {
$("#btnAdd").click(function () {
$(".error-msg").empty();
$.ajax({
url: "/task/add/",
type: "post",
data: $("#formAdd").serialize(),
dataType: "JSON",
success: function (res) {
if (res.status) {
alert("添加成功");
} else {
$.each(res.error, function (name, data) {
// console.log(name, data);
$("#id_" + name)
.next()
.text(data[0]);
});
}
},
});
});
}
@csrf_exempt
def task_add(request):
# print("添加任务", request.POST)
# 1.用户发送过来的数据进行校验
form = TaskModelForm(data=request.POST)
if form.is_valid():
form.save()
data_dict = {"status": True}
return HttpResponse(json.dumps(data_dict))
data_dict = {"status": False, 'error': form.errors}
return HttpResponse(json.dumps(data_dict, ensure_ascii=False))
4. Django开发
4.1 知识点回顾
- 安装Django
pip install django
- 创建Django项目
- 注意:PyCharm也可以创建(需要先将settings.py中的DIR templates 删除)
>>> django-admin startproject mysite
- 创建APP
- 需要将APP注册在settings.py中
- 注意:否则APP下的models.py写类时,无法在数据库中创建表
>>> python manage.py startapp app01
>>> python manage.py startapp app02
>>> python manage.py startapp app03
INSTALLED_APPS = [
...
'app01.apps.App01Config',
]
配置静态文件路径 & 模板路径
- 放在APP目录下
配置数据库相关操作(MySQL)
- 第三方模块(django3版本)
pip install mysqlclient
自己先去MySQL创建一个数据库
配置数据库连接settings.py
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", # 数据库类型 "NAME": "djangotest03", # 数据库名称 "USER": "root", # 用户名 "PASSWORD": "root123", # 密码 "HOST": "127.0.0.1", # 主机 "PORT": "3306", # 端口 } }
在APP下的models.py中编写表模型
""" 管理员表 """ class Admin(models.Model): username = models.CharField(verbose_name="用户名", max_length=32) password = models.CharField(verbose_name="密码", max_length=64) def __str__(self): return self.username """ 任务表 """ class Task(models.Model): level_choices = ( (1, "紧急"), (2, "重要"), (3, "一般"), ) level = models.SmallIntegerField(verbose_name="任务级别", choices=level_choices, default=3) title = models.CharField(verbose_name="任务标题", max_length=64) detail = models.TextField(verbose_name="任务详情") user = models.ForeignKey(verbose_name="负责人", to="Admin", to_field="id", on_delete=models.CASCADE)
- 执行两个命令(创建数据库中的表)
>>> python manage.py makemigrations >>> python manage.py migrate
在urls.py,路由(URL和视图函数的对应关系)
在views.py中,写视图函数,编写业务逻辑
templates目录,编写HTML模板(含有模板语法、继承、
{% static 'xxx' %}
、…)ModelForm & Form组件,在我们开发增删改查功能
- 生成HTML标签(生成默认值…)
- 对用户提交的数据进行校验
- 保存到数据库(ModelForm)
- 获取显示错误信息
Cookie & Session,用户登录信息保存起来
中间件,基于中间件实现用户认证;基于:
process_request
ORM操作
models.User.objects.filter(id="xxx")
models.User.objects.filter(id="xxx").order_by("-id")
- 封装分页组件