订单管理

表结构设计

编辑myproject/app01/models.py

class Order(models.Model):
    """订单"""
    oid = models.CharField(verbose_name="订单号", max_length=64)
    title = models.CharField(verbose_name="名称", max_length=32)
    price = models.IntegerField(verbose_name="价格")
    status_choices = {
        (1, "待支付"),
        (2, "已支付"),
    }
    status = models.SmallIntegerField(verbose_name="状态", choices=status_choices, default=1)
    admin = models.ForeignKey(verbose_name="管理员", to="Admin", on_delete=models.CASCADE)

生成数据库表

makemigrations
migrate

添加订单管理,新建订单按钮

 编写路由

myproject/myproject/urls.py

  #1.导入order
  from app01.views import depart, pretty, user, admin, account, task, order

  #2.订单管理 path('order/list/', order.order_list),

创建视图函数文件myproject/app01/views/order.py

from django.shortcuts import render

def order_list(request):
    return render(request, 'order_list.html')

  

创建HTML页面myproject/app01/templates/order_list.html

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div>
            <input type="button" value="新建订单" class="btn btn-primary">
        </div>
    </div>
{% endblock %}

  

添加订单管理myproject/app01/templates/layout.html

<li><a href="/order/list/">订单管理</a></li>

  

 浏览器查看一下吧

 实现点击新建订单,给一个弹出框进行新建,而不是一个新的页面

先做一个弹出对话框

编辑myproject/app01/templates/order_list.html

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div>
            {#  <input type="button" value="新建订单" class="btn btn-primary" data-toggle="modal" data-target="#myModal">  #}
            {#  data-toggle="modal" data-target="#myModal"  方法一:点击弹出对话框#}
            {#  方法二 :绑定事件 #}
            <input id="btnAdd" type="button" value="新建订单" class="btn btn-primary" >
        </div>
    </div>

    {#  新建订单(对话框) #}
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="myModalLabel">Modal title</h4>
                </div>
                <div class="modal-body">
                    ...
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    <button type="button" class="btn btn-primary">Save changes</button>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

{% block js %}
    <script type="text/javascript">
        $(function (){
            bindBtnAddEvent();
        })

        function bindBtnAddEvent(){
            $("#btnAdd").click(function (){
                //点击新建按钮,显示对话框
                $('#myModal').modal('show');
            });
        }
    </script>
{% endblock %}

看下效果吧

 怎么在弹出的对话框中显示表单内容呢

使用ModelForm来实现吧

修改myproject/app01/views/order.py

from django.shortcuts import render

from app01 import models
from app01.utils.bootstrap import BootStrapModelForm

class OrderModelForm(BootStrapModelForm):
    class Meta:
        model = models.Order
        fields = "__all__"

def order_list(request):
    form = OrderModelForm()
    return render(request, 'order_list.html', {'form': form})

 

 编辑myproject/app01/templates/order_list.html

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div>
            {#  data-toggle="modal" data-target="#myModal"  方法一:点击弹出对话框#}
            <input type="button" value="新建订单1" class="btn btn-primary" data-toggle="modal" data-target="#myModal">

            {#  方法二 :绑定事件 #}
            <input id="btnAdd" type="button" value="新建订单2" class="btn btn-primary">
        </div>
    </div>

    {#  新建订单(对话框) #}
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="myModalLabel">Modal title</h4>
                </div>
                <div class="modal-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>

                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    <button type="button" class="btn btn-primary">Save changes</button>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

{% block js %}
    <script type="text/javascript">
        $(function () {
            bindBtnAddEvent();
        })

        function bindBtnAddEvent() {
            $("#btnAdd").click(function () {
                //点击新建按钮,显示对话框
                $('#myModal').modal('show');
            });
        }
    </script>
{% endblock %}

  

 看一下效果吧

订单号一般在后台,不需要填写

排除订单号

修改myproject/app01/views/order.py

 

 修改标题

编辑myproject/app01/templates/order_list.html

 接下来做点击保存到数据库

编辑myproject/app01/templates/order_list.html

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div>
            {#  data-toggle="modal" data-target="#myModal"  方法一:点击弹出对话框#}
            <input type="button" value="新建订单1" class="btn btn-primary" data-toggle="modal" data-target="#myModal">

            {#  方法二 :绑定事件 #}
            <input id="btnAdd" type="button" value="新建订单2" class="btn btn-primary">
        </div>
    </div>

    {#  新建订单(对话框) #}
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="myModalLabel">新建</h4>
                </div>
                <div class="modal-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>

                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    <button id="btnSave" type="button" class="btn btn-primary">保存</button>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

{% block js %}
    <script type="text/javascript">
        $(function () {
            bindBtnAddEvent();
            bindBtnSaveEvent();
        })

        function bindBtnAddEvent() {
            $("#btnAdd").click(function () {
                //点击新建按钮,显示对话框
                $('#myModal').modal('show');
            });
        }
        function bindBtnSaveEvent() {
            $("#btnSave").click(function () {

                $.ajax({
                    url:"/order/add/",
                    type: "post",
                    data: $("#formAdd").serialize(),
                    dataType: "JSON",
                    success:function (res){
                        console.log(res);
                    }
                })

            });
        }
    </script>
{% endblock %}

 

添加路由myproject/myproject/urls.py

path('order/add/', order.order_add),

修改myproject/app01/views/order.py 

from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from app01 import models
from app01.utils.bootstrap import BootStrapModelForm

class OrderModelForm(BootStrapModelForm):
    class Meta:
        model = models.Order
        # fields = "__all__"
        exclude = ["oid"]

def order_list(request):
    form = OrderModelForm()
    return render(request, 'order_list.html', {'form': form})

@csrf_exempt
def order_add(request):
    """新建订单(Ajax请求)"""
    form = OrderModelForm(data=request.POST)
    if form.is_valid():
        form.save()
        return JsonResponse({"status": True})

    return JsonResponse({"status": False, 'error': form.errors})

  

 看下效果吧

怎样把错误信息显示在页面上呢

编辑myproject/app01/templates/order_list.html

function bindBtnSaveEvent() {
            $("#btnSave").click(function () {

                $.ajax({
                    url:"/order/add/",
                    type: "post",
                    data: $("#formAdd").serialize(),
                    dataType: "JSON",
                    success:function (res){
                        {#console.log(res);#}
                        if (res.status){
                            alert("创建成功");
                        }else {
                            //把错误信息显示在对话框中
                            $.each(res.error, function (name, errorList){
                                $("#id_"+name).next().text(errorList[0]);
                            })
                        }
                    }
                })

            });
        }

 

 成功

 现在填写名称后,名称下的错误信息依然存在,怎么清除上一次的错误信息呢

编辑myproject/app01/templates/order_list.html

 订单号不需要用户填写,直接新建保存到数据库订单号要么为空,要么报错,此时我们需要自己在后台随机生成一个订单号,跟用户输入的数据一起保存到数据库中

修改myproject/app01/views/order.py

import random
from datetime import datetime
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from app01 import models
from app01.utils.bootstrap import BootStrapModelForm

class OrderModelForm(BootStrapModelForm):
    class Meta:
        model = models.Order
        # fields = "__all__"
        exclude = ["oid"]

def order_list(request):
    form = OrderModelForm()
    return render(request, 'order_list.html', {'form': form})

@csrf_exempt
def order_add(request):
    """新建订单(Ajax请求)"""
    form = OrderModelForm(data=request.POST)
    if form.is_valid():
      
     #额外增加一些不是用户输入的值(自己计算出来的) form.instance.oid = datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(1000,9999))
#保存到数据库中 form.save() return JsonResponse({"status": True}) return JsonResponse({"status": False, 'error': form.errors})

  

 这样就生成了一个订单号(年月日时分秒+随机数)

 

管理员选项不让选择了,实现排除 admin 管理员, 默认使用当前登录用户为管理员

修改myproject/app01/views/order.py

import random
from datetime import datetime
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from app01 import models
from app01.utils.bootstrap import BootStrapModelForm

class OrderModelForm(BootStrapModelForm):
class Meta:
model = models.Order
# fields = "__all__"
# 排除 oid 订单号,让系统自动生成
# 排除 admin 管理员, 默认使用当前登录用户为管理员
exclude = ["oid", "admin"]

def order_list(request):
form = OrderModelForm()
return render(request, 'order_list.html', {'form': form})

@csrf_exempt
def order_add(request):
"""新建订单(Ajax请求)"""
form = OrderModelForm(data=request.POST)
if form.is_valid():

#额外增加一些不是用户输入的值(自己计算出来的)
#增加oid订单号,动态变化的(年月日时分秒+随机数)
form.instance.oid = datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(1000,9999))

#固定设置管理员ID,需要去session中获取
#设置当前登录用户为订单的管理员
form.instance.admin_id = request.session["info"]["id"]

#保存到数据库中
form.save()
return JsonResponse({"status": True})

return JsonResponse({"status": False, 'error': form.errors})

 

 

 我们发现一个问题,点击保存后填写的数据依然存在,怎样清空填写的数据呢

创建成功时,我们需要清空表单数据,创建失败时,不需要清空

编辑myproject/app01/templates/order_list.html

//清空表单  $("#formAdd")是jQuery对象 --> $("#formAdd")[0]  DOM对象
 $("#formAdd")[0].reset();
                            

 

 此时,创建成功后点击确定,表单就被清空了

 

 创建成功后我们的弹出对话框应该关闭,怎么实现呢

编辑myproject/app01/templates/order_list.html

 //关闭对话框
$('#myModal').modal('hide');

  

 此时创建成功后点击确定,对话框就隐藏了

订单列表及分页

 修改myproject/app01/views/order.py

import random
from datetime import datetime
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from app01 import models
from app01.utils.bootstrap import BootStrapModelForm
from app01.utils.pagination import Pagination

class OrderModelForm(BootStrapModelForm):
    class Meta:
        model = models.Order
        # fields = "__all__"
        # 排除 oid 订单号,让系统自动生成
        # 排除 admin 管理员, 默认使用当前登录用户为管理员
        exclude = ["oid", "admin"]

def order_list(request):
    queryset = models.Order.objects.all().order_by('-id')
    page_object = Pagination(request, queryset)
    form = OrderModelForm()
    context = {
        'form': form,
        'queryset': page_object.page_queryset,  # 分完页的数据
        "page_string": page_object.html()  # 生成的页码
    }


    return render(request, 'order_list.html', context)

@csrf_exempt
def order_add(request):
    """新建订单(Ajax请求)"""
    form = OrderModelForm(data=request.POST)
    if form.is_valid():

        #额外增加一些不是用户输入的值(自己计算出来的)
        #增加oid订单号,动态变化的(年月日时分秒+随机数)
        form.instance.oid = datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(1000,9999))

        #固定设置管理员ID,需要去session中获取
        #设置当前登录用户为订单的管理员
        form.instance.admin_id = request.session["info"]["id"]

        #保存到数据库中
        form.save()
        return JsonResponse({"status": True})

    return JsonResponse({"status": False, 'error': form.errors})

 

 编辑myproject/app01/templates/order_list.html

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div>
            {#  data-toggle="modal" data-target="#myModal"  方法一:点击弹出对话框#}
            <input type="button" value="新建订单1" class="btn btn-primary" data-toggle="modal" data-target="#myModal">

            {#  方法二 :绑定事件 #}
            <input id="btnAdd" type="button" value="新建订单2" class="btn btn-primary">
        </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>
                    <th>管理员</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr>
                        <th>{{ obj.id }}</th>
                        <td>{{ obj.oid }}</td>
                        <td>{{ obj.title }}</td>
                        <td>{{ obj.price }}</td>
                        <td>{{ obj.get_status_display }}</td>
                        <td>{{ obj.admin.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>
        <ul class="pagination">
            {{ page_string }}
        </ul>


    </div>

    {#  新建订单(对话框) #}
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="myModalLabel">新建</h4>
                </div>
                <div class="modal-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>

                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    <button id="btnSave" type="button" class="btn btn-primary">保存</button>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

{% block js %}
    <script type="text/javascript">
        $(function () {
            bindBtnAddEvent();
            bindBtnSaveEvent();
        })

        function bindBtnAddEvent() {
            $("#btnAdd").click(function () {
                //点击新建按钮,显示对话框
                $('#myModal').modal('show');
            });
        }

        function bindBtnSaveEvent() {
            $("#btnSave").click(function () {
                //清除错误信息
                $(".error_msg").empty();

                //向后台发送请求
                $.ajax({
                    url: "/order/add/",
                    type: "post",
                    data: $("#formAdd").serialize(),
                    dataType: "JSON",
                    success: function (res) {
                        {#console.log(res);#}
                        if (res.status) {
                            alert("创建成功");
                            //清空表单  $("#formAdd")是jQuery对象 --> $("#formAdd")[0]  DOM对象
                            $("#formAdd")[0].reset();

                            //关闭对话框
                            $('#myModal').modal('hide');

                        } else {
                            //把错误信息显示在对话框中
                            $.each(res.error, function (name, errorList) {
                                $("#id_" + name).next().text(errorList[0]);
                            })
                        }
                    }
                })

            });
        }
    </script>
{% endblock %}

  

 

 看一下效果吧

 插入数据后需要手动刷新,页面才能展示新输入的信息

怎样实现自动刷新呢

 编辑myproject/app01/templates/order_list.html

     //刷新页面
     location.reload();

  

 这样就完成自动刷新了

订单删除

目标:
实现点击删除按钮后,弹出确认删除弹出框,确认后再进行删除

显示删除弹出框,点击取消,取消对话框,确认放在下面完成

 编辑myproject/app01/templates/order_list.html

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div style="margin-bottom: 10px">
            {#  data-toggle="modal" data-target="#myModal"  方法一:点击弹出对话框#}
            <input type="button" value="新建订单1" class="btn btn-primary" data-toggle="modal" data-target="#myModal">

            {#  方法二 :绑定事件 #}
            <input id="btnAdd" type="button" value="新建订单2" class="btn btn-primary">
        </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>
                    <th>管理员</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr>
                        <th>{{ obj.id }}</th>
                        <td>{{ obj.oid }}</td>
                        <td>{{ obj.title }}</td>
                        <td>{{ obj.price }}</td>
                        <td>{{ obj.get_status_display }}</td>
                        <td>{{ obj.admin.username }}</td>

                        <td>
                            <a class="btn btn-primary btn-xs" href="#">编辑</a>
                            {# <a class="btn btn-danger btn-xs" href="#">删除</a>  #}
                            <input class="btn btn-danger btn-xs btn-delete" type="button" value="删除">
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
        <ul class="pagination">
            {{ page_string }}
        </ul>


    </div>

    <!--  新建订单(对话框) -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="myModalLabel">新建</h4>
                </div>
                <div class="modal-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>

                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    <button id="btnSave" type="button" class="btn btn-primary">保存</button>
                </div>
            </div>
        </div>
    </div>

    <!--  删除订单(对话框) -->
    <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">

            <div class="alert alert-danger alert-dismissible fade in" role="alert">
                <h4>是否确定删除?</h4>
                <p style="margin: 10px 0;">删除后,所有关联数据都会被删除。</p>
                <p style="text-align: right;">
                    <button type="button" class="btn btn-danger">确定</button>
                    <!-- data-dismiss="modal" 取消对话框 -->
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                </p>
            </div>

        </div>
    </div>

{% endblock %}

{% block js %}
    <script type="text/javascript">
        $(function () {
            bindBtnAddEvent();
            bindBtnSaveEvent();
            bindBtnDeleteEvent();
        })

        function bindBtnAddEvent() {
            $("#btnAdd").click(function () {
                //点击新建按钮,显示对话框
                $('#myModal').modal('show');
            });
        }

        function bindBtnSaveEvent() {
            $("#btnSave").click(function () {
                //清除错误信息
                $(".error_msg").empty();

                //向后台发送请求
                $.ajax({
                    url: "/order/add/",
                    type: "post",
                    data: $("#formAdd").serialize(),
                    dataType: "JSON",
                    success: function (res) {
                        {#console.log(res);#}
                        if (res.status) {
                            alert("创建成功");
                            //清空表单  $("#formAdd")是jQuery对象 --> $("#formAdd")[0]  DOM对象
                            $("#formAdd")[0].reset();

                            //关闭对话框
                            $('#myModal').modal('hide');

                            //刷新页面
                            location.reload();

                        } else {
                            //把错误信息显示在对话框中
                            $.each(res.error, function (name, errorList) {
                                $("#id_" + name).next().text(errorList[0]);
                            })
                        }
                    }
                })

            });
        }

        function bindBtnDeleteEvent() {
            $(".btn-delete").click(function () {
                //alert("点击了删除");
                //显示删除对话框
                $("#deleteModal").modal('show');

            });
        }
    </script>
{% endblock %}

 看下效果吧

 下面来实现点击确认,删除对应信息吧

下面是用 js 和 ajax的方式实现数据行的删除,注意下面的id与class绑定匹配, 例如:

$(".btn-delete")对应HTML中的class="btn-delete"位置
$("#btnConfirmDelete")对应HTML中的id="btnConfirmDelete"位置

编辑myproject/app01/templates/order_list.html 

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div style="margin-bottom: 10px">
            {#  data-toggle="modal" data-target="#myModal"  方法一:点击弹出对话框#}
            <input type="button" value="新建订单1" class="btn btn-primary" data-toggle="modal" data-target="#myModal">

            {#  方法二 :绑定事件 #}
            <input id="btnAdd" type="button" value="新建订单2" class="btn btn-primary">
        </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>
                    <th>管理员</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr uid="{{ obj.id }}">
                        <th>{{ obj.id }}</th>
                        <td>{{ obj.oid }}</td>
                        <td>{{ obj.title }}</td>
                        <td>{{ obj.price }}</td>
                        <td>{{ obj.get_status_display }}</td>
                        <td>{{ obj.admin.username }}</td>

                        <td>
                            <a class="btn btn-primary btn-xs" href="#">编辑</a>
                            {# <a class="btn btn-danger btn-xs" href="#">删除</a>  #}
                            <input uid = "{{ obj.id }}" class="btn btn-danger btn-xs btn-delete" type="button" value="删除">
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
        <ul class="pagination">
            {{ page_string }}
        </ul>


    </div>

    <!--  新建订单(对话框) -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="myModalLabel">新建</h4>
                </div>
                <div class="modal-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>

                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    <button id="btnSave" type="button" class="btn btn-primary">保存</button>
                </div>
            </div>
        </div>
    </div>

    <!--  删除订单(对话框) -->
    <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">

            <div class="alert alert-danger alert-dismissible fade in" role="alert">
                <h4>是否确定删除?</h4>
                <p style="margin: 10px 0;">删除后,所有关联数据都会被删除。</p>
                <p style="text-align: right;">
                    <button id="btnConfirmDelete" type="button" class="btn btn-danger">确定</button>
                    <!-- data-dismiss="modal" 取消对话框 -->
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                </p>
            </div>

        </div>
    </div>

{% endblock %}

{% block js %}
    <script type="text/javascript">
        var DELETE_ID;

        $(function () {
            bindBtnAddEvent();
            bindBtnSaveEvent();
            bindBtnDeleteEvent();
            bindBtnConfirmDeleteEvent();
        })

        function bindBtnAddEvent() {
            $("#btnAdd").click(function () {
                //点击新建按钮,显示对话框
                $('#myModal').modal('show');
            });
        }

        function bindBtnSaveEvent() {
            $("#btnSave").click(function () {
                //清除错误信息
                $(".error_msg").empty();

                //向后台发送请求
                $.ajax({
                    url: "/order/add/",
                    type: "post",
                    data: $("#formAdd").serialize(),
                    dataType: "JSON",
                    success: function (res) {
                        {#console.log(res);#}
                        if (res.status) {
                            alert("创建成功");
                            //清空表单  $("#formAdd")是jQuery对象 --> $("#formAdd")[0]  DOM对象
                            $("#formAdd")[0].reset();

                            //关闭对话框
                            $('#myModal').modal('hide');

                            //刷新页面
                            location.reload();

                        } else {
                            //把错误信息显示在对话框中
                            $.each(res.error, function (name, errorList) {
                                $("#id_" + name).next().text(errorList[0]);
                            })
                        }
                    }
                })

            });
        }

        function bindBtnDeleteEvent() {
            $(".btn-delete").click(function () {
                //alert("点击了删除");
                //显示删除对话框
                $("#deleteModal").modal('show');

                //获取当前行的ID并赋值给全局变量
                DELETE_ID = $(this).attr('uid');

            });
        }

        function bindBtnConfirmDeleteEvent(){
            $("#btnConfirmDelete").click(function (){
                //点击确认删除按钮,将全局变量中设置的那个要删除ID发送到后台
                $.ajax({
                    url: "/order/delete/",
                    type: "GET",
                    data: {
                        uid: DELETE_ID
                    },
                    dataType: "JSON",
                    success: function (res){
                        if (res.status){
                            //alert("删除成功");
                            //隐藏删除框
                            //$("#deleteModal").modal('hide');

                            //在页面上将当前一行数据删除(js)
                            //$("tr[uid='" + DELETE_ID + "']").remove();

                            //将要删除的id置空
                            //DELETE_ID = 0;

                            //刷新页面列表
                            location.reload();



                        }else {
                            //删除失败
                            alert(res.error);
                        }
                    }
                })
            });
        }
    </script>
{% endblock %}

location.reload(); 表示删除完成后,让页面自动刷新
它上面注释掉的那一段,可以实现删除后,让页面删除的那一行清除,但是会有一个问题,第二页的数据不会顶上来,也就是说当前页面有 10 行数据,我们删除一行后,只剩下 9 行数据,不会自动刷新

编辑myproject/myproject/urls.py

path('order/delete/', order.order_delete),

编辑myproject/app01/views/order.py

import random
from datetime import datetime
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from app01 import models
from app01.utils.bootstrap import BootStrapModelForm
from app01.utils.pagination import Pagination

class OrderModelForm(BootStrapModelForm):
    class Meta:
        model = models.Order
        # fields = "__all__"
        # 排除 oid 订单号,让系统自动生成
        # 排除 admin 管理员, 默认使用当前登录用户为管理员
        exclude = ["oid", "admin"]

def order_list(request):
    queryset = models.Order.objects.all().order_by('-id')
    page_object = Pagination(request, queryset)
    form = OrderModelForm()
    context = {
        'form': form,
        'queryset': page_object.page_queryset,  # 分完页的数据
        "page_string": page_object.html()  # 生成的页码
    }


    return render(request, 'order_list.html', context)

@csrf_exempt
def order_add(request):
    """新建订单(Ajax请求)"""
    form = OrderModelForm(data=request.POST)
    if form.is_valid():

        #额外增加一些不是用户输入的值(自己计算出来的)
        #增加oid订单号,动态变化的(年月日时分秒+随机数)
        form.instance.oid = datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(1000,9999))

        #固定设置管理员ID,需要去session中获取
        #设置当前登录用户为订单的管理员
        form.instance.admin_id = request.session["info"]["id"]

        #保存到数据库中
        form.save()
        return JsonResponse({"status": True})

    return JsonResponse({"status": False, 'error': form.errors})

#GET请求不需要加免除csrf认证
def order_delete(request):
    """删除订单"""
    uid = request.GET.get('uid')
    exists = models.Order.objects.filter(id=uid).exists()
    if not exists:
        return JsonResponse({"status":False, 'error':"删除失败,数据不存在"})

    models.Order.objects.filter(id=uid).delete()
    return JsonResponse({"status":True})

  

 浏览器看下吧

 删除成功

 

 

订单编辑

编辑myproject/app01/templates/order_list.html

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div style="margin-bottom: 10px">
            {#  data-toggle="modal" data-target="#myModal"  方法一:点击弹出对话框#}
            <input type="button" value="新建订单1" class="btn btn-success" data-toggle="modal" data-target="#myModal">

            {#  方法二 :绑定事件 #}
            <input id="btnAdd" type="button" value="新建订单2" class="btn btn-success">
        </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>
                    <th>管理员</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr uid="{{ obj.id }}">
                        <th>{{ obj.id }}</th>
                        <td>{{ obj.oid }}</td>
                        <td>{{ obj.title }}</td>
                        <td>{{ obj.price }}</td>
                        <td>{{ obj.get_status_display }}</td>
                        <td>{{ obj.admin.username }}</td>

                        <td>
                            <input uid="{{ obj.id }}" type="button" class="btn btn-primary btn-xs btn-edit" value="编辑">
                            <input uid="{{ obj.id }}" class="btn btn-danger btn-xs btn-delete" type="button" value="删除">
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
        <ul class="pagination">
            {{ page_string }}
        </ul>


    </div>

    <!--  新建/编辑 订单(对话框) -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="myModalLabel">新建</h4>
                </div>
                <div class="modal-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>

                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    <button id="btnSave" type="button" class="btn btn-primary">保存</button>
                </div>
            </div>
        </div>
    </div>

    <!--  删除订单(对话框) -->
    <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">

            <div class="alert alert-danger alert-dismissible fade in" role="alert">
                <h4>是否确定删除?</h4>
                <p style="margin: 10px 0;">删除后,所有关联数据都会被删除。</p>
                <p style="text-align: right;">
                    <button id="btnConfirmDelete" type="button" class="btn btn-danger">确定</button>
                    <!-- data-dismiss="modal" 取消对话框 -->
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                </p>
            </div>

        </div>
    </div>

{% endblock %}

{% block js %}
    <script type="text/javascript">
        var DELETE_ID;
        var EDIT_ID;
        $(function () {
            bindBtnAddEvent();
            bindBtnSaveEvent();
            bindBtnDeleteEvent();
            bindBtnConfirmDeleteEvent();
            bindBtnEditEvent();
        })

        function bindBtnAddEvent() {
            $("#btnAdd").click(function () {
                // 将正在编辑的 ID 设置为空
                EDIT_ID = undefined;

                //清空对话框中的数据
                $("#formAdd")[0].reset();

                //设置对话框的标题
                $("#myModalLabel").text("新建");

                //点击新建按钮,显示对话框
                $('#myModal').modal('show');
            });
        }

        function bindBtnSaveEvent() {
            $("#btnSave").click(function () {
                //清除错误信息
                $(".error_msg").empty();

                if (EDIT_ID) {
                    //编辑
                    doEdit();
                } else {
                    //添加
                    doAdd();
                }


            });
        }

        function doEdit() {
            //向后台发送请求 (添加的Ajax请求)
            $.ajax({
                url: "/order/edit/" + "?uid=" + EDIT_ID,
                type: "post",
                data: $("#formAdd").serialize(),
                dataType: "JSON",
                success: function (res) {
                    {#console.log(res);#}
                    if (res.status) {
                        //alert("创建成功");
                        //清空表单  $("#formAdd")是jQuery对象 --> $("#formAdd")[0]  DOM对象
                        $("#formAdd")[0].reset();

                        //关闭对话框
                        $('#myModal').modal('hide');

                        //刷新页面
                        location.reload();

                    } else {
                        if (res.tips) {
                            alert(res.tips);
                        } else {
                            //把错误信息显示在对话框中
                            $.each(res.error, function (name, errorList) {
                                $("#id_" + name).next().text(errorList[0]);
                            })
                        }
                    }
                }
            })
        }

        function doAdd() {
            //向后台发送请求 (添加的Ajax请求)
            $.ajax({
                url: "/order/add/",
                type: "post",
                data: $("#formAdd").serialize(),
                dataType: "JSON",
                success: function (res) {
                    {#console.log(res);#}
                    if (res.status) {
                        alert("创建成功");
                        //清空表单  $("#formAdd")是jQuery对象 --> $("#formAdd")[0]  DOM对象
                        $("#formAdd")[0].reset();

                        //关闭对话框
                        $('#myModal').modal('hide');

                        //刷新页面
                        location.reload();

                    } else {
                        //把错误信息显示在对话框中
                        $.each(res.error, function (name, errorList) {
                            $("#id_" + name).next().text(errorList[0]);
                        })
                    }
                }
            })
        }

        function bindBtnDeleteEvent() {
            $(".btn-delete").click(function () {
                //alert("点击了删除");
                //显示删除对话框
                $("#deleteModal").modal('show');

                //获取当前行的ID并赋值给全局变量
                DELETE_ID = $(this).attr('uid');

            });
        }

        function bindBtnConfirmDeleteEvent() {
            $("#btnConfirmDelete").click(function () {
                //点击确认删除按钮,将全局变量中设置的那个要删除ID发送到后台
                $.ajax({
                    url: "/order/delete/",
                    type: "GET",
                    data: {
                        uid: DELETE_ID
                    },
                    dataType: "JSON",
                    success: function (res) {
                        if (res.status) {
                            //alert("删除成功");
                            //隐藏删除框
                            //$("#deleteModal").modal('hide');

                            //在页面上将当前一行数据删除(js)
                            //$("tr[uid='" + DELETE_ID + "']").remove();

                            //将要删除的id置空
                            //DELETE_ID = 0;

                            //刷新页面列表
                            location.reload();


                        } else {
                            //删除失败
                            alert(res.error);
                        }
                    }
                })
            });
        }

        function bindBtnEditEvent() {
            $(".btn-edit").click(function () {
                //清空对话框中的数据
                $("#formAdd")[0].reset();

                var uid = $(this).attr("uid");
                EDIT_ID = uid;


                //发送 Ajax 去后台获取当前行的相关数据
                $.ajax({
                    url: "/order/detail/",
                    type: "get",
                    data: {
                        uid: uid
                    },
                    dataType: "JSON",
                    success: function (res) {
                        if (res.status) {
                            console.log(res.data);
                            //将数据赋值到对话框中的标签中
                            $.each(res.data, function (name, value) {
                                $("#id_" + name).val(value);
                            })

                            //修改对话框的标题
                            $("#myModalLabel").text("编辑");

                            //编辑何新建的对话框一致的,所以用同一个就可以了,点击编辑按钮,显示对话框
                            $('#myModal').modal('show');
                        } else {
                            alert(res.error);
                        }
                    }
                })
                //默认在对话框中存在需要编辑的数据
            });
        }
    </script>
{% endblock %}

 

在上面的代码中,进行了如下方面的操作:

  • 编辑和新建订单共用一个对话框,使用doEditdoAdd进行区分
  • 编辑页面中自动填充已有数据
  • 编辑的js代码分为bindBtnEditEvent()doEdit()
  • 编辑对话框中保存时,需要考虑到当前的数据行是否存在

编辑myproject/app01/views/order.py

import random
from datetime import datetime
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from app01 import models
from app01.utils.bootstrap import BootStrapModelForm
from app01.utils.pagination import Pagination


class OrderModelForm(BootStrapModelForm):
    class Meta:
        model = models.Order
        # fields = "__all__"
        # 排除 oid 订单号,让系统自动生成
        # 排除 admin 管理员, 默认使用当前登录用户为管理员
        exclude = ["oid", "admin"]


def order_list(request):
    queryset = models.Order.objects.all().order_by('-id')
    page_object = Pagination(request, queryset)
    form = OrderModelForm()
    context = {
        'form': form,
        'queryset': page_object.page_queryset,  # 分完页的数据
        "page_string": page_object.html()  # 生成的页码
    }

    return render(request, 'order_list.html', context)


@csrf_exempt
def order_add(request):
    """新建订单(Ajax请求)"""
    form = OrderModelForm(data=request.POST)
    if form.is_valid():
        # 额外增加一些不是用户输入的值(自己计算出来的)
        # 增加oid订单号,动态变化的(年月日时分秒+随机数)
        form.instance.oid = datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(1000, 9999))

        # 固定设置管理员ID,需要去session中获取
        # 设置当前登录用户为订单的管理员
        form.instance.admin_id = request.session["info"]["id"]

        # 保存到数据库中
        form.save()
        return JsonResponse({"status": True})

    return JsonResponse({"status": False, 'error': form.errors})


# GET请求不需要加免除csrf认证
def order_delete(request):
    """删除订单"""
    uid = request.GET.get('uid')
    exists = models.Order.objects.filter(id=uid).exists()
    if not exists:
        return JsonResponse({"status": False, 'error': "删除失败,数据不存在"})

    models.Order.objects.filter(id=uid).delete()
    return JsonResponse({"status": True})


def order_detail(request):
    """根据ID获取订单详细"""
    """
    方式一
    uid = request.GET.get("uid")
    row_object = models.Order.objects.filter(id=uid).first()
    if not row_object:
        return JsonResponse({"status":False, 'error': "数据不存在"})

    # 从数据库中获取到一个对象 row_object
    result = {
        "status": True,
        "data": {
            "title": row_object.title,
            "price": row_object.price,
            "status": row_object.status,
        }
    }
    return JsonResponse(result)
    """

    # 方式二
    uid = request.GET.get("uid")
    row_dict = models.Order.objects.filter(id=uid).values("title", "price", "status").first()
    if not row_dict:
        return JsonResponse({"status": False, 'error': "数据不存在"})

    # 从数据库中获取到一个对象 row_object
    result = {
        "status": True,
        "data": row_dict
    }
    return JsonResponse(result)

@csrf_exempt
def order_edit(request):
    """编辑订单"""
    uid = request.GET.get("uid")
    row_object = models.Order.objects.filter(id=uid).first()
    if not row_object:
        return JsonResponse({"status": False, "tips": "数据不存在,请刷新重试"})

    # 获取编辑界面提交的数据
    data = request.POST
    # 判断编辑的内容是否跟以前一样
    if data["title"] != '' and data['price'] != '' and data['status'] != '':
        flag = 0
        if row_object.title == data["title"]:
            flag += 1
        if row_object.price == int(data["price"]):
            flag += 1
        if row_object.status == int(data["status"]):
            flag += 1
        # 如果输入的内容与原有内容相同,则进行提示
        if flag == 3:
            return JsonResponse({"status": False, "tips": "您没有变更任何内容,无需修改!"})

    form = OrderModelForm(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return JsonResponse({"status": True})

    return JsonResponse({"status": False, "error": form.errors})

编辑myproject/myproject/urls.py

    path('order/detail/', order.order_detail),
    path('order/edit/', order.order_edit),

  

 

 

 

 

 

 

 

 

posted @ 2023-10-30 17:44  可可eleven  阅读(77)  评论(0)    收藏  举报