Ajax的案例-任务管理
任务添加(一)
首先为该页面创建一个表
编辑myproject/app01/models.py
class Task(models.Model):
"""任务"""
level_choices = (
(1, "紧急"),
(2, "重要"),
(3, "临时"),
)
level = models.SmallIntegerField(verbose_name="级别", choices=level_choices, default=1)
title = models.CharField(verbose_name="标题", max_length=64)
detail = models.TextField(verbose_name="详细信息")
user = models.ForeignKey(verbose_name="负责人", to=Admin, on_delete=models.CASCADE)
更新
makemigrations migrate
编辑myproject/app01/views/task.py
import json
from django.shortcuts import render,HttpResponse
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from app01 import models
from app01.utils.bootstrap import BootStrapModelForm
class TaskModelForm(BootStrapModelForm):
class Meta:
model = models.Task
fields = "__all__"
def task_list(request):
"""任务列表"""
form = TaskModelForm()
return render(request, "task_list.html", {"form": form})
@csrf_exempt
def task_ajax(request):
#GET请求
print(request.GET)
#POST请求
print(request.POST)
data_dict = {"status": True, 'data': [11,22,33,44]}
return HttpResponse(json.dumps(data_dict))
# json_string = json.dumps(data_dict)
# return HttpResponse(json_string)
# return JsonResponse(data_dict)

编辑myproject/app01/templates/task_list.html
<div class="panel panel-default">
<div class="panel-heading">表单</div>
<div class="panel-body">
<form method="post" novalidate>
{% for field in form %}
<div class="form-group">
<label>{{ field.label }}</label>
{{ field }}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提 交</button>
</form>
</div>
</div>

浏览器看下效果吧

detail详细信息默认是Textarea框,如果想修改为TextInput框,编辑myproject/app01/views/task.py
class TaskModelForm(BootStrapModelForm):
class Meta:
model = models.Task
fields = "__all__"
widgets = {
"detail":forms.TextInput
}


问题出现了,负责人应该是一个用户,怎么获取到用户名呢

解决办法:编辑myproject/app01/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


接下来实现将添加的数据发送到后台
一个输入框占一行太过分了,让我们把表单优化一下吧
加入栅格
编辑myproject/app01/templates/task_list.html
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">表单</div>
<div class="panel-body">
<form method="post" novalidate>
<div class="clearfix">
{% for field in form %}
<div class="col-xs-6">
<div class="form-group">
<label>{{ field.label }}</label>
{{ field }}
</div>
</div>
{% endfor %}
<div class="col-xs-12">
<button type="submit" class="btn btn-primary">提 交</button>
</div>
</div>
</form>
</div>
</div>
<hr/>
<h1>Ajax学习</h1>
<h3>示例1</h3>
<input id="btn1" type="button" value="点击1" class="btn btn-primary"/>
<h3>示例2</h3>
<input type="text" id="txtuser" placeholder="姓名">
<input type="text" id="txtAge" placeholder="年龄">
<input id="btn2" type="button" value="点击2" class="btn btn-primary">
<h3>示例3</h3>
<form 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" value="点击3" class="btn btn-primary">
</div>
{% endblock %}
{% block js %}
<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);
console.log(res.status);
console.log(res.data);
}
})
})
}
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);
console.log(res.status);
console.log(res.data);
}
})
})
}
function bindBtn3Event() {
$("#btn3").click(function () {
$.ajax({
url: '/task/ajax/',
type: "post",
data: $("#form3").serialize(),
dataType: "JSON",
success: function (res) {
console.log(res);
console.log(res.status);
console.log(res.data);
}
})
})
}
</script>
{% endblock %}

看下效果

用户输入信息,提交到后台
编辑myproject/app01/templates/task_list.html
{% extends 'layout.html' %}
{% block content %}
<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 %}
<div class="col-xs-6">
<div class="form-group">
<label>{{ field.label }}</label>
{{ field }}
</div>
</div>
{% endfor %}
<div class="col-xs-12">
<button id="btnAdd" type="button" class="btn btn-primary">提 交</button>
</div>
</div>
</form>
</div>
</div>
<hr/>
<h1>Ajax学习</h1>
<h3>示例1</h3>
<input id="btn1" type="button" value="点击1" class="btn btn-primary"/>
<h3>示例2</h3>
<input type="text" id="txtuser" placeholder="姓名">
<input type="text" id="txtAge" placeholder="年龄">
<input id="btn2" type="button" value="点击2" class="btn btn-primary">
<h3>示例3</h3>
<form 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" value="点击3" class="btn btn-primary">
</div>
{% endblock %}
{% block js %}
<script type="text/javascript">
$(function () {
{# 页面框架加载完成之后代码自动执行 #}
bindBtn1Event();
bindBtn2Event();
bindBtn3Event();
bindBtnAddEvent();
})
function bindBtn1Event() {
$("#btn1").click(function () {
$.ajax({
url: '/task/ajax/',
type: "post",
data: {
n1: 123,
n2: 456
},
dataType: "JSON",
success: function (res) {
console.log(res);
console.log(res.status);
console.log(res.data);
}
})
})
}
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);
console.log(res.status);
console.log(res.data);
}
})
})
}
function bindBtn3Event() {
$("#btn3").click(function () {
$.ajax({
url: '/task/ajax/',
type: "post",
data: $("#form3").serialize(),
dataType: "JSON",
success: function (res) {
console.log(res);
console.log(res.status);
console.log(res.data);
}
})
})
}
function bindBtnAddEvent() {
$("#btnAdd").click(function () {
$.ajax({
url: '/task/add/',
type: "post",
data: $("#formAdd").serialize(),
dataType: "JSON",
success: function (res) {
console.log(res);
console.log(res.status);
console.log(res.data);
}
})
})
}
</script>
{% endblock %}
修改myproject/myproject/urls.py
path('task/add/', task.task_add),
修改myproject/app01/views/task.py
@csrf_exempt
def task_add(request):
print(request.POST)
data_dict = {"status": True}
return HttpResponse(json.dumps(data_dict))



接下来保存数据并进行数据校验
修改myproject/app01/views/task.py
@csrf_exempt
def task_add(request):
print(request.POST)
# 1.用户发送过来的数据进行校验(ModelForm进行数据校验)
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))

编辑myproject/app01/templates/task_list.html
{% extends 'layout.html' %}
{% block content %}
<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 %}
<div class="col-xs-6">
<div class="form-group" style="position: relative;margin-bottom: 20px">
<label>{{ field.label }}</label>
{{ field }}
<span class="error_msg" style="color: red;position: absolute;"></span>
</div>
</div>
{% endfor %}
<div class="col-xs-12">
<button id="btnAdd" type="button" class="btn btn-primary">提 交</button>
</div>
</div>
</form>
</div>
</div>
<hr/>
<h1>Ajax学习</h1>
<h3>示例1</h3>
<input id="btn1" type="button" value="点击1" class="btn btn-primary"/>
<h3>示例2</h3>
<input type="text" id="txtuser" placeholder="姓名">
<input type="text" id="txtAge" placeholder="年龄">
<input id="btn2" type="button" value="点击2" class="btn btn-primary">
<h3>示例3</h3>
<form 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" value="点击3" class="btn btn-primary">
</div>
{% endblock %}
{% block js %}
<script type="text/javascript">
$(function () {
{# 页面框架加载完成之后代码自动执行 #}
bindBtn1Event();
bindBtn2Event();
bindBtn3Event();
bindBtnAddEvent();
})
function bindBtn1Event() {
$("#btn1").click(function () {
$.ajax({
url: '/task/ajax/',
type: "post",
data: {
n1: 123,
n2: 456
},
dataType: "JSON",
success: function (res) {
console.log(res);
console.log(res.status);
console.log(res.data);
}
})
})
}
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);
console.log(res.status);
console.log(res.data);
}
})
})
}
function bindBtn3Event() {
$("#btn3").click(function () {
$.ajax({
url: '/task/ajax/',
type: "post",
data: $("#form3").serialize(),
dataType: "JSON",
success: function (res) {
console.log(res);
console.log(res.status);
console.log(res.data);
}
})
})
}
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) {
$("#id_" + name).next().text(data[0]);
})
}
}
})
})
}
</script>
{% endblock %}





接下来完善一下任务管理页面
任务列表
编辑myproject/app01/views/task.py
def task_list(request):
"""任务列表"""
#去数据库获取所有的任务
queryset = models.Task.objects.all().order_by('-id')
form = TaskModelForm()
context = {
"form": form,
"queryset": queryset
}
return render(request, "task_list.html", context)

编辑myproject/app01/templates/task_list.html
{% extends 'layout.html' %}
{% block content %}
<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 %}
<div class="col-xs-6">
<div class="form-group" style="position: relative;margin-bottom: 20px">
<label>{{ field.label }}</label>
{{ field }}
<span class="error_msg" style="color: red;position: absolute;"></span>
</div>
</div>
{% endfor %}
<div class="col-xs-12">
<button id="btnAdd" type="button" class="btn btn-primary">提 交</button>
</div>
</div>
</form>
</div>
</div>
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">
<span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
任务列表
</div>
<!-- Table -->
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>标题</th>
<th>级别</th>
<th>负责人</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in queryset %}
<tr>
<th>{{ obj.id }}</th>
<td>{{ obj.title }}</td>
<td>{{ obj.get_level_display }}</td>
<td>{{ obj.user.username }}</td>
<td>
<a class="btn btn-primary btn-xs" href="#">编辑</a>
<a class="btn btn-danger btn-xs" href="#">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{# 把学习的部分往后放 #}
<div style="height: 1000px"></div>
<hr/>
<h1>Ajax学习</h1>
<h3>示例1</h3>
<input id="btn1" type="button" value="点击1" class="btn btn-primary"/>
<h3>示例2</h3>
<input type="text" id="txtuser" placeholder="姓名">
<input type="text" id="txtAge" placeholder="年龄">
<input id="btn2" type="button" value="点击2" class="btn btn-primary">
<h3>示例3</h3>
<form 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" value="点击3" class="btn btn-primary">
</div>
{% endblock %}
{% block js %}
<script type="text/javascript">
$(function () {
{# 页面框架加载完成之后代码自动执行 #}
bindBtn1Event();
bindBtn2Event();
bindBtn3Event();
bindBtnAddEvent();
})
function bindBtn1Event() {
$("#btn1").click(function () {
$.ajax({
url: '/task/ajax/',
type: "post",
data: {
n1: 123,
n2: 456
},
dataType: "JSON",
success: function (res) {
console.log(res);
console.log(res.status);
console.log(res.data);
}
})
})
}
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);
console.log(res.status);
console.log(res.data);
}
})
})
}
function bindBtn3Event() {
$("#btn3").click(function () {
$.ajax({
url: '/task/ajax/',
type: "post",
data: $("#form3").serialize(),
dataType: "JSON",
success: function (res) {
console.log(res);
console.log(res.status);
console.log(res.data);
}
})
})
}
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) {
$("#id_" + name).next().text(data[0]);
})
}
}
})
})
}
</script>
{% endblock %}

浏览器看下效果吧

我们发现个问题,添加数据后列表不会自动刷新,要实现刷新,只有刷新页面
怎样实现添加数据后列表自动刷新呢
编辑myproject/app01/templates/task_list.html
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("添加成功");
//用JS实现页面的刷新
location.reload()
} else {
// 否则将错误信息显示在输入框下
$.each(res.error, function (name, data) {
$("#id_" + name).next().text(data[0]);
})
}
}
})
})
}

这样就完成列表自动刷新了
添加分页
编辑myproject/app01/views/task.py
1.导入分页组件
from app01.utils.pagination import Pagination
2.实现分页
def task_list(request):
"""任务列表"""
#去数据库获取所有的任务
queryset = models.Task.objects.all().order_by('-id')
page_object = Pagination(request, queryset)
form = TaskModelForm()
context = {
"form": form,
'queryset': page_object.page_queryset, # 分完页的数据
"page_string": page_object.html() # 生成的页码
}
return render(request, "task_list.html", context)

编辑myproject/app01/templates/task_list.html
<ul class="pagination">
{{ page_string }}
</ul>

看下效果吧


浙公网安备 33010602011771号