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>

 

 看下效果吧

 

 

 

 

posted @ 2023-10-27 11:56  可可eleven  阅读(53)  评论(0)    收藏  举报