Django+BootstrapTable實現數據的增刪改查

工程目錄如下:

一、查:

index.html:

<!DOCTYPE html>
<html lang="en">

<head>
    {% load static %}
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="{% static 'libs/bootstrap/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'libs/toastr/css/toastr.css' %}">
    <link rel="stylesheet" href="{% static 'libs/bootstrap-table-master/bootstrap-table.css' %}">
    <script src="{% static 'libs/jquery/jquery-1.11.2.min.js' %}"></script>
    <script src="{% static 'libs/bootstrap/js/bootstrap.min.js' %}"></script>
    <script src="{% static 'libs/toastr/js/toastr.min.js' %}"></script>
    <script src="{% static 'libs/bootstrap-table-master/bootstrap-table.js' %}"></script>
    <script src="{% static 'libs/bootstrap-table-master/locale/bootstrap-table-zh-CN.js' %}"></script>
</head>

<body>
    <div style="padding: 20px;">
        <table id="articles-table" data-toggle="table" class="table table-bordered table-striped"></table>
    </div>

    <script>
        var $articlesTable = $('#articles-table').bootstrapTable('destroy').bootstrapTable({
            url: '/blog/all/',
            method: 'GET',
            dataType: "json",
            uniqueId: 'id',
            striped: false,
            cache: false,
            sortName: 'id',
            sortable: false,
            sortOrder: 'desc',
            sidePagination: "server",
            undefinedText: '--',
            singleSelect: false,
            toolbar: '#soft-toolbar',
            search: false,
            strictSearch: true,
            clickToSelect: true,
            pagination: true,
            pageNumber: 1,
            pageSize: 5,
            pageList: [5, 10, 20, 50, 100],
            paginationPreText: "上一頁",
            paginationNextText: "下一頁",
            queryParamsType: "",
            queryParams: function (params) {
                var temp = {
                    'pageSize': params.pageSize,
                    'pageNumber': params.pageNumber,
                    'searchText': params.searchText,
                    'sortName': params.sortName,
                    'sortOrder': params.sortOrder
                };
                return temp;
            },
            columns: [
                {
                    checkbox: true
                }, {
                    field: 'title',
                    title: '標題',
                    width: '12%'
                }, {
                    field: 'content',
                    title: '內容',
                    width: '62%'
                }, {
                    field: 'create_time',
                    title: '創建時間',
                    width: '10%'
                }, {
                    title: '刪除',
                    formatter: function (value, row, index) {
                        return '<button type="button" class="btn btn-primary btn-xs" οnclick="deleteData(' + row.id + ')">刪除</button>';
                    }
                }
            ],
            onLoadError: function () {
                toastr.error("數據加載失敗!", "錯誤提示");
            },
            onClickRow: function (row, $element) {
                //    EditViewById(id, 'view');
            }
        });
    </script>
</body>

</html>

models.py:

from django.db import models
from django.utils import timezone

# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length=32, default='Title')
    content = models.TextField(null = True)
    create_time = models.DateTimeField(default=timezone.now)

blog/views.py:

from django.shortcuts import render
from django.views.decorators import csrf
from django.http import HttpResponse
from . import models
from django.views.decorators.csrf import csrf_exempt
import json

# Create your views here.

@csrf_exempt
def index(request):
    return render(request, 'index.html')

@csrf_exempt
def all(request):
    if request.method == 'GET':
        page_size = int(request.GET['pageSize'])
        page_number = int(request.GET['pageNumber'])

        total = models.Article.objects.count()
        articles = models.Article.objects.order_by('-id')[(page_number-1)*page_size:page_number*page_size]
        rows = []
        data = {'total': total, 'rows': rows}
        for article in articles:
            rows.append({
                'id': article.id,
                'title': article.title,
                'content': article.content
            })

        return HttpResponse(json.dumps(data), content_type='application/json')

blog/urls.py:

from django.urls import path, include
from . import views

urlpatterns = [
   path('all/', views.all),
]

demo7/urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls'))
]

二、增:

post.html:

<!DOCTYPE html>
<html lang="en">

<head>
    {% load static %}
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="{% static 'libs/bootstrap/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'libs/toastr/css/toastr.css' %}">
    <link rel="stylesheet" href="{% static 'libs/bootstrap-table-master/bootstrap-table.css' %}">
    <script src="{% static 'libs/jquery/jquery-1.11.2.min.js' %}"></script>
    <script src="{% static 'libs/bootstrap/js/bootstrap.min.js' %}"></script>
    <script src="{% static 'libs/toastr/js/toastr.min.js' %}"></script>
    <script src="{% static 'libs/bootstrap-table-master/bootstrap-table.js' %}"></script>
    <script src="{% static 'libs/bootstrap-table-master/locale/bootstrap-table-zh-CN.js' %}"></script>
</head>

<body>
    <form action="" method="POST" class="form-horizontal" style="padding: 20px;">
        <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label">標題:</label>
            <div class="col-sm-10">
                <input type="text" id="title" class="form-control" />
            </div>
        </div>

        <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label">內容:</label>
            <div class="col-sm-10">
                <textarea id="content" class="form-control"></textarea>
            </div>
        </div>

        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button id="submit-button" type="submit" class="btn btn-default">提交</button>
            </div>
        </div>
    </form>

    <div style="padding: 20px;">
        <table id="articles-table" data-toggle="table" class="table table-bordered table-striped"></table>
    </div>

    <script>
        $("#submit-button").click(function () {
            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/add_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { title: $("#title").val(), content: $("#content").val() },
                success: function (data) {
                    if (data.ret) {
                        toastr.success("數據添加成功!", "成功提示!");
                        $articlesTable.bootstrapTable("refresh");
                    }
                }
            });
        })

        var $articlesTable = $('#articles-table').bootstrapTable('destroy').bootstrapTable({
            url: '/blog/all/',
            method: 'GET',
            dataType: "json",
            uniqueId: 'id',
            striped: false,
            cache: false,
            sortName: 'id',
            sortable: false,
            sortOrder: 'desc',
            sidePagination: "server",
            undefinedText: '--',
            singleSelect: false,
            toolbar: '#soft-toolbar',
            search: false,
            strictSearch: true,
            clickToSelect: true,
            pagination: true,
            pageNumber: 1,
            pageSize: 5,
            pageList: [5, 10, 20, 50, 100],
            paginationPreText: "上一頁",
            paginationNextText: "下一頁",
            queryParamsType: "",
            queryParams: function (params) {
                var temp = {
                    'pageSize': params.pageSize,
                    'pageNumber': params.pageNumber,
                    'searchText': params.searchText,
                    'sortName': params.sortName,
                    'sortOrder': params.sortOrder
                };
                return temp;
            },
            columns: [
                {
                    checkbox: true
                }, {
                    field: 'title',
                    title: '標題',
                    width: '12%'
                }, {
                    field: 'content',
                    title: '內容',
                    width: '62%'
                }, {
                    field: 'create_time',
                    title: '創建時間',
                    width: '10%'
                }, {
                    title: '刪除',
                    formatter: function (value, row, index) {
                        return '<button type="button" class="btn btn-primary btn-xs" οnclick="deleteData(' + row.id + ')">刪除</button>';
                    }
                }
            ],
            onLoadError: function () {
                toastr.error("數據加載失敗!", "錯誤提示");
            },
            onClickRow: function (row, $element) {
                //    EditViewById(id, 'view');
            }
        });
    </script>
</body>

</html>

blog/urls.py:

from django.urls import path, include
from . import views

urlpatterns = [
   path('index/', views.index),
   path('add_article/', views.add_article),
   path('add_page/', views.add_page),
   path('all/', views.all),
]

blog/views.py:

from django.shortcuts import render
from django.views.decorators import csrf
from django.http import HttpResponse
from . import models
from django.views.decorators.csrf import csrf_exempt
import json

# Create your views here.
@csrf_exempt
def add_page(request):
    return render(request, 'post.html')

@csrf_exempt
def all(request):
    if request.method == 'GET':
        page_size = int(request.GET['pageSize'])
        page_number = int(request.GET['pageNumber'])

        total = models.Article.objects.count()
        articles = models.Article.objects.order_by('-id')[(page_number-1)*page_size:page_number*page_size]
        rows = []
        data = {'total': total, 'rows': rows}
        for article in articles:
            rows.append({
                'id': article.id,
                'title': article.title,
                'content': article.content
            })

        return HttpResponse(json.dumps(data), content_type='application/json')

@csrf_exempt
def add_article(request):
    ctx ={}
    if request.POST:
        ctx['title'] = request.POST['title']
        ctx['content'] = request.POST['content']
        test1  = models.Article(title=ctx['title'], content=ctx['content'])
        test1.save()
        
        data = {'ret': True, 'msg': '數據提交成功!'}
        return HttpResponse(json.dumps(data), content_type="application/json")

三、刪:

post.html:

<!DOCTYPE html>
<html lang="en">

<head>
    {% load static %}
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="{% static 'libs/bootstrap/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'libs/toastr/css/toastr.css' %}">
    <link rel="stylesheet" href="{% static 'libs/bootstrap-table-master/bootstrap-table.css' %}">
    <script src="{% static 'libs/jquery/jquery-1.11.2.min.js' %}"></script>
    <script src="{% static 'libs/bootstrap/js/bootstrap.min.js' %}"></script>
    <script src="{% static 'libs/toastr/js/toastr.min.js' %}"></script>
    <script src="{% static 'libs/bootstrap-table-master/bootstrap-table.js' %}"></script>
    <script src="{% static 'libs/bootstrap-table-master/locale/bootstrap-table-zh-CN.js' %}"></script>
</head>

<body>
    <form action="" method="POST" class="form-horizontal" style="padding: 20px;">
        <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label">標題:</label>
            <div class="col-sm-10">
                <input type="text" id="title" class="form-control" />
            </div>
        </div>

        <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label">內容:</label>
            <div class="col-sm-10">
                <textarea id="content" class="form-control"></textarea>
            </div>
        </div>

        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button id="submit-button" type="submit" class="btn btn-default">提交</button>
            </div>
        </div>
    </form>

    <div style="padding: 20px;">
        <table id="articles-table" data-toggle="table" class="table table-bordered table-striped"></table>
    </div>

    <script>
        $("#submit-button").click(function () {
            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/add_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { title: $("#title").val(), content: $("#content").val() },
                success: function (data) {
                    if (data.ret) {
                        toastr.success("數據添加成功!", "成功提示!");
                        $articlesTable.bootstrapTable("refresh");
                    }
                }
            });
        })

        var $articlesTable = $('#articles-table').bootstrapTable('destroy').bootstrapTable({
            url: '/blog/all/',
            method: 'GET',
            dataType: "json",
            uniqueId: 'id',
            striped: false,
            cache: false,
            sortName: 'id',
            sortable: false,
            sortOrder: 'desc',
            sidePagination: "server",
            undefinedText: '--',
            singleSelect: false,
            toolbar: '#soft-toolbar',
            search: false,
            strictSearch: true,
            clickToSelect: true,
            pagination: true,
            pageNumber: 1,
            pageSize: 5,
            pageList: [5, 10, 20, 50, 100],
            paginationPreText: "上一頁",
            paginationNextText: "下一頁",
            queryParamsType: "",
            queryParams: function (params) {
                var temp = {
                    'pageSize': params.pageSize,
                    'pageNumber': params.pageNumber,
                    'searchText': params.searchText,
                    'sortName': params.sortName,
                    'sortOrder': params.sortOrder
                };
                return temp;
            },
            columns: [
                {
                    checkbox: true
                }, {
                    field: 'id',
                    title: 'ID'
                }, {
                    field: 'title',
                    title: '標題',
                    width: '12%'
                }, {
                    field: 'content',
                    title: '內容',
                    width: '62%'
                }, {
                    field: 'create_time',
                    title: '創建時間',
                    width: '10%'
                }, {
                    title: '刪除',
                    formatter: function (value, row, index) {
                        //return `<a class="btn btn-primary btn-xs" οnclick="alert(123);">aaa刪除</a>`;
                          return `<a class="btn btn-primary btn-xs" onclick="deleteData(${row.id});">aaa刪除</a>`;
                    }
                }
            ],
            onLoadError: function () {
                toastr.error("數據加載失敗!", "錯誤提示");
            },
            onClickRow: function (row, $element) {
                //    EditViewById(id, 'view');
            }
        });

        // 刪除
        function deleteData(id){
            console.log(id);
            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/delete_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { id },
                success: function (data) {
                    if (data.ret) {
                        toastr.success(data.msg, "成功提示!");
                        $articlesTable.bootstrapTable("refresh");
                    }
                }
            });
        }
    </script>
</body>

</html>

其中 

return `<a class="btn btn-primary btn-xs" onclick="deleteData(${row.id});">aaa刪除</a>`;

是關鍵。

view.py:

from django.shortcuts import render
from django.views.decorators import csrf
from django.http import HttpResponse
from . import models
from django.views.decorators.csrf import csrf_exempt
import json

# Create your views here.
@csrf_exempt
def add_page(request):
    return render(request, 'post.html')

@csrf_exempt
def all(request):
    if request.method == 'GET':
        page_size = int(request.GET['pageSize'])
        page_number = int(request.GET['pageNumber'])

        total = models.Article.objects.count()
        articles = models.Article.objects.order_by('-id')[(page_number-1)*page_size:page_number*page_size]
        rows = []
        data = {'total': total, 'rows': rows}
        for article in articles:
            rows.append({
                'id': article.id,
                'title': article.title,
                'content': article.content
            })

        return HttpResponse(json.dumps(data), content_type='application/json')

@csrf_exempt
def add_article(request):
    ctx ={}
    if request.POST:
        ctx['title'] = request.POST['title']
        ctx['content'] = request.POST['content']
        test1  = models.Article(title=ctx['title'], content=ctx['content'])
        test1.save()
        
        data = {'ret': True, 'msg': '數據提交成功!'}
        return HttpResponse(json.dumps(data), content_type="application/json")

@csrf_exempt
def delete_article(request):
    article = models.Article.objects.get(id=request.POST['id'])
    article.delete()
    data = {'ret': True, 'msg': '刪除成功!'}
    return HttpResponse(json.dumps(data), content_type='application/json')

其中:

@csrf_exempt
def delete_article(request):
    article = models.Article.objects.get(id=request.POST['id'])
    article.delete()
    data = {'ret': True, 'msg': '刪除成功!'}
    return HttpResponse(json.dumps(data), content_type='application/json')

是關鍵。

blog/urls.py:

from django.urls import path, include
from . import views

urlpatterns = [
   path('add_article/', views.add_article),
   path('add_page/', views.add_page),
   path('all/', views.all),
   path('delete_article/', views.delete_article),
]

四、改:

1、首先通過id獲取相關內容,然後將修改後的內容提交給該id對應的內容。

post.html:

`<a class="btn btn-primary btn-xs" onclick="modifyData(${row.id});">修改</a>`
        // 修改
        function modifyData(id) {
            $("#modify-modal").modal("show");
            $("#modify-modal-id").val(id);

            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/query_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { id },
                success: function (data) {
                    if (data.ret) {
                        $("#modify-modal-title").val(data.data.title);
                        $("#modify-modal-content").val(data.data.content);
                    }
                }
            });
        }
$("#modify-modal-form-submit").click(function(e){
            e.preventDefault();
            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/modify_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { id: $("#modify-modal-id").val(), title: $("#modify-modal-title").val(), content: $("#modify-modal-content").val() },
                success: function (data) {
                    if (data.ret) {
                        toastr.success(data.msg, "成功提示");
                        $("#modify-modal").modal("hide");
                        $articlesTable.bootstrapTable("refresh");
                    }
                }
            });

blog/views.py:

@csrf_exempt
def query_article(request):
    id = request.POST['id']
    article = models.Article.objects.get(pk=id)
    data = {
        'ret': True,
        'data': {
            'title': article.title,
            'content': article.content
        }
    }

    return HttpResponse(json.dumps(data), content_type='application/json')


@csrf_exempt
def modify_article(request):
    id = request.POST['id']
    title = request.POST['title']
    content = request.POST['content']
    article = models.Article.objects.get(pk=id)
    article.title = title
    article.content = content
    article.save()
    data={'ret': True, 'msg': '修改文章成功!'}
    return HttpResponse(json.dumps(data), content_type='application/json')

blog/urls.py:

   path('query_article/', views.query_article),
   path('modify_article/', views.modify_article),

整個增刪改查的代碼如下:

post.html:

<!DOCTYPE html>
<html lang="en">

<head>
    {% load static %}
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="{% static 'libs/bootstrap/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'libs/toastr/css/toastr.css' %}">
    <link rel="stylesheet" href="{% static 'libs/bootstrap-table-master/bootstrap-table.css' %}">
    <script src="{% static 'libs/jquery/jquery-1.11.2.min.js' %}"></script>
    <script src="{% static 'libs/bootstrap/js/bootstrap.min.js' %}"></script>
    <script src="{% static 'libs/toastr/js/toastr.min.js' %}"></script>
    <script src="{% static 'libs/bootstrap-table-master/bootstrap-table.js' %}"></script>
    <script src="{% static 'libs/bootstrap-table-master/locale/bootstrap-table-zh-CN.js' %}"></script>
</head>

<body>
    <form action="" method="POST" class="form-horizontal" style="padding-top: 20px; padding-right: 20px;">
        <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label">標題:</label>
            <div class="col-sm-10">
                <input type="text" id="title" class="form-control" />
            </div>
        </div>

        <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label">內容:</label>
            <div class="col-sm-10">
                <textarea id="content" class="form-control"></textarea>
            </div>
        </div>

        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button id="submit-button" type="submit" class="btn btn-default">提交</button>
            </div>
        </div>
    </form>

    <div style="padding-left: 20px; padding-right: 20px;">
        <table id="articles-table" data-toggle="table" class="table table-bordered table-striped"></table>
    </div>

    <!--modal begin-->
    <div class="modal fade" id="modify-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
        aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">
                        ×
                    </button>
                    <h4 class="modal-title"> 修改文章 </h4>
                </div>
                <form id="modify-modal-form" class="form-horizontal" action="">
                    <div class="modal-body">
                        <input type="hidden" id="modify-modal-id"/>
                        <div class="form-group row">
                            <label
                                class="col-sm-3 col-md-3 col-lg-3 col-xl-3 control-label font-normal align-right">標題:</label>
                            <div class="col-sm-7 col-md-7 col-lg-7 col-xl-7">
                                <div class="file-input-container">
                                    <input type="text" class="form-control" id="modify-modal-title" />
                                </div>
                            </div>
                        </div>

                        <div class="form-group row">
                            <label
                                class="col-sm-3 col-md-3 col-lg-3 col-xl-3 control-label font-normal align-right">內容:</label>
                            <div class="col-sm-7 col-md-7 col-lg-7 col-xl-7">
                                <div class="file-input-container">
                                    <textarea class="form-control" id="modify-modal-content"></textarea>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">關閉</button>
                        <button type="submit" class="btn btn-success" id="modify-modal-form-submit">發送</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <!--modal end-->

    <script>
        $("#submit-button").click(function () {
            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/add_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { title: $("#title").val(), content: $("#content").val() },
                success: function (data) {
                    if (data.ret) {
                        toastr.success("數據添加成功!", "成功提示!");
                        $articlesTable.bootstrapTable("refresh");
                    }
                }
            });
        })

        var $articlesTable = $('#articles-table').bootstrapTable('destroy').bootstrapTable({
            url: '/blog/all/',
            method: 'GET',
            dataType: "json",
            uniqueId: 'id',
            striped: false,
            cache: false,
            sortName: 'id',
            sortable: false,
            sortOrder: 'desc',
            sidePagination: "server",
            undefinedText: '--',
            singleSelect: false,
            toolbar: '#soft-toolbar',
            search: false,
            strictSearch: true,
            clickToSelect: true,
            pagination: true,
            pageNumber: 1,
            pageSize: 5,
            pageList: [5, 10, 20, 50, 100],
            paginationPreText: "上一頁",
            paginationNextText: "下一頁",
            queryParamsType: "",
            queryParams: function (params) {
                var temp = {
                    'pageSize': params.pageSize,
                    'pageNumber': params.pageNumber,
                    'searchText': params.searchText,
                    'sortName': params.sortName,
                    'sortOrder': params.sortOrder
                };
                return temp;
            },
            columns: [
                {
                    checkbox: true
                }, {
                    field: 'id',
                    title: 'ID'
                }, {
                    field: 'title',
                    title: '標題',
                    width: '12%'
                }, {
                    field: 'content',
                    title: '內容',
                    width: '62%'
                }, {
                    field: 'create_time',
                    title: '創建時間',
                    width: '10%'
                }, {
                    title: '操作',
                    formatter: function (value, row, index) {
                        //return `<a class="btn btn-primary btn-xs" οnclick="alert(123);">aaa刪除</a>`;
                        return `<a class="btn btn-primary btn-xs" onclick="deleteData(${row.id});">刪除</a>
                                <a class="btn btn-primary btn-xs" onclick="modifyData(${row.id});">修改</a>
                                `;
                    }
                }
            ],
            onLoadError: function () {
                toastr.error("數據加載失敗!", "錯誤提示");
            },
            onClickRow: function (row, $element) {
                //    EditViewById(id, 'view');
            }
        });

        // 刪除
        function deleteData(id) {
            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/delete_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { id },
                success: function (data) {
                    if (data.ret) {
                        toastr.success(data.msg, "成功提示!");
                        $articlesTable.bootstrapTable("refresh");
                    }
                }
            });
        }

        // 修改
        function modifyData(id) {
            $("#modify-modal").modal("show");
            $("#modify-modal-id").val(id);

            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/query_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { id },
                success: function (data) {
                    if (data.ret) {
                        $("#modify-modal-title").val(data.data.title);
                        $("#modify-modal-content").val(data.data.content);
                    }
                }
            });
        }

        $("#modify-modal-form-submit").click(function(e){
            e.preventDefault();
            $.ajax({
                cache: false,
                type: "POST",
                url: "/blog/modify_article/",
                //traditional: true, //加上此項可以傳數組
                dataType: 'json',
                data: { id: $("#modify-modal-id").val(), title: $("#modify-modal-title").val(), content: $("#modify-modal-content").val() },
                success: function (data) {
                    if (data.ret) {
                        toastr.success(data.msg, "成功提示");
                        $("#modify-modal").modal("hide");
                        $articlesTable.bootstrapTable("refresh");
                    }
                }
            });
        })
    </script>
</body>

</html>

blog/views.py:

from django.shortcuts import render
from django.views.decorators import csrf
from django.http import HttpResponse
from . import models
from django.views.decorators.csrf import csrf_exempt
import json

# Create your views here.
@csrf_exempt
def index(request):
    return render(request, 'post.html')

@csrf_exempt
def all(request):
    if request.method == 'GET':
        page_size = int(request.GET['pageSize'])
        page_number = int(request.GET['pageNumber'])

        total = models.Article.objects.count()
        articles = models.Article.objects.order_by('-id')[(page_number-1)*page_size:page_number*page_size]
        rows = []
        data = {'total': total, 'rows': rows}
        for article in articles:
            rows.append({
                'id': article.id,
                'title': article.title,
                'content': article.content
            })

        return HttpResponse(json.dumps(data), content_type='application/json')

@csrf_exempt
def add_article(request):
    ctx ={}
    if request.POST:
        ctx['title'] = request.POST['title']
        ctx['content'] = request.POST['content']
        test1  = models.Article(title=ctx['title'], content=ctx['content'])
        test1.save()
        
        data = {'ret': True, 'msg': '數據提交成功!'}
        return HttpResponse(json.dumps(data), content_type="application/json")

@csrf_exempt
def delete_article(request):
    article = models.Article.objects.get(id=request.POST['id'])
    article.delete()
    data = {'ret': True, 'msg': '刪除成功!'}
    return HttpResponse(json.dumps(data), content_type='application/json')

@csrf_exempt
def query_article(request):
    id = request.POST['id']
    article = models.Article.objects.get(pk=id)
    data = {
        'ret': True,
        'data': {
            'title': article.title,
            'content': article.content
        }
    }

    return HttpResponse(json.dumps(data), content_type='application/json')


@csrf_exempt
def modify_article(request):
    id = request.POST['id']
    title = request.POST['title']
    content = request.POST['content']
    article = models.Article.objects.get(pk=id)
    article.title = title
    article.content = content
    article.save()
    data={'ret': True, 'msg': '修改文章成功!'}
    return HttpResponse(json.dumps(data), content_type='application/json')

demo7/urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls'))
]

blog/urls.py:

from django.urls import path, include
from . import views

urlpatterns = [
   path('index/', views.index),
   path('all/', views.all),
   path('add_article/', views.add_article),
   path('delete_article/', views.delete_article),
   path('query_article/', views.query_article),
   path('modify_article/', views.modify_article),
]

blog/models.py:

from django.db import models
from django.utils import timezone

# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length=32, default='Title')
    content = models.TextField(null = True)
    create_time = models.DateTimeField(default=timezone.now)

demo7/setting.py:

"""
Django settings for demo7 project.

Generated by 'django-admin startproject' using Django 2.0.

For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'mk^y1nl_435!fx7y@za4)06&bfv_07sc!o7phjph%+2gm9uh8i'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'demo7.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'demo7.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'demo7', #選擇數據庫的名稱,請確認你的mysql中有這個庫
        'USER': 'root',
        'PASSWORD': '666123',
        'HOST': '127.0.0.1', #在通過命令行模式給dj用戶授權的時候,指定的主機是localhost,改成127.0.0.1就能正常遷移數據庫了。
        'PORT': '3306'
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [ 
    os.path.join(BASE_DIR, "statics"), 
]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章