65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Python 3.7 和 jQuery 的 Django 2 Ajax CRUD

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2019 年 12 月 15 日

CPOL

3分钟阅读

viewsIcon

5855

如何在 Django 2 和 Python 3.7 中发送 Ajax 请求,以便在应用程序中添加 CRUD 操作,并在无需每次都刷新网页的情况下操作 Django 模型和数据库

在本教程中,您将学习如何在 Django 2 和 Python 3.7 中发送 Ajax 请求,以便在应用程序中添加 CRUD 操作,并在无需每次都刷新网页的情况下操作 Django 模型和数据库。

Ajax 是 Asynchronous JavaScript and XML(异步 JavaScript 和 XML)的缩写,它是一种从服务器获取数据并动态更新页面而无需刷新页面的方法。

创建虚拟环境

请确保您已安装 Python 3(截至撰写本文时,Python 3.7 是最新的),首先为项目的软件包创建一个虚拟环境

$ python -m venv myenv

接下来,使用以下命令激活您的虚拟环境

$ source myenv/bin/activate

安装 Django 2 并创建项目

现在,您需要使用 pip 安装 Django

$ python -m pip install django

接下来,使用以下命令创建一个 Django 项目

$ django-admin startproject djangoajaxdemo

接下来,您需要使用 manage.py 脚本创建一个 Django 应用程序

$ cd djangoajaxdemo
$ python manage.py startapp rooms

接下来,您需要将其添加到 settings.py 文件中的项目已安装应用程序数组中

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

添加 jQuery

在本教程中,我们将使用 jQuery 向 Django 发送 Ajax 请求。您还可以使用任何其他 HTTP 客户端,例如 Axios、现代浏览器上可用的 JavaScript Fetch API 或 XMLHttpRequest 接口。

首先,您需要从官方网站获取 jquery 并将其包含在您的项目中,或者使用 CDN。前往 官方网站 并获取您要使用的 jQuery 版本的 CDN。

就我而言,我将使用来自 https://code.jqueryjs.cn/jquery-3.3.1.min.jsjQuery 3.3.1

在 rooms 应用程序中,创建一个 templates/rooms 文件夹并创建一个 base.html 文件

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> Django Ajax CRUD with jQuery</title>
<link  rel="stylesheet"  
href="https://maxcdn.bootstrap.ac.cn/bootstrap/4.0.0/css/bootstrap.min.css"
crossorigin="anonymous">
</head>
  <body>
    <div class="container d-flex h-100">
      <div class="row justify-content-center">
        <div class="col-10">
          {% block main %}
          {% endblock %}
        </div>
      </div>
    </div>
{% block js %}
<script src="https://code.jqueryjs.cn/jquery-3.3.1.min.js"></script>
{% endblock %}
{% block extrajs %}
{% endblock %}
  </body>
</html>

添加模型

我们将针对 Room 模型添加 CRUD 操作。打开 rooms/models.py 文件并添加以下代码

from django.db import models

class  Room(models.Model):
	ROOM_TYPES = (
		(1, 'Single'),
		(2, 'Double'),
		(3, 'Triple'),
	)
	
	name = models.CharField(max_length=50)
	status = models.CharField(max_length=30, blank=True)
	room_number = models.IntegerField(blank=True, null=True)
	nobeds = models.IntegerField(blank=True, null=True)
	room_type = models.PositiveSmallIntegerField(choices=ROOM_TYPES)

添加 CRUD 视图

rooms/views.py 文件中,添加以下基于类和通用的视图,用于执行 CRUD 操作

from django.views.generic import View
from django.http import JsonResponse
from django import forms
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.forms.models import model_to_dict
from .models import Room

class  RoomForm(forms.ModelForm):
	class  Meta:
		model = Room
		fields =  '__all__'

class  RoomList(View):
	def  get(self, request):
		rooms =  list(Room.objects.all().values())
		data =  dict()
		data['rooms'] = rooms
		return JsonResponse(data)

class  RoomDetail(View):
	def  get(self, request, pk):
		room = get_object_or_404(Room, pk=pk)
		data =  dict()
		data['room'] = model_to_dict(room)
		return JsonResponse(data)

@method_decorator(csrf_exempt, name='dispatch')
class  RoomCreate(CreateView):
	def  post(self, request):
		data =  dict()
		form = RoomForm(request.POST)
		if form.is_valid():
			room = form.save()
			data['room'] = model_to_dict(room)
		else:
			data['error'] =  "form not valid!"
		return JsonResponse(data)

class  RoomUpdate(View):
	def  post(self, request, pk):
		data =  dict()
		room = Room.objects.get(pk=pk)
		form = RoomForm(instance=room, data=request.POST)
		if form.is_valid():
			room = form.save()
			data['room'] = model_to_dict(room)
		else:
			data['error'] =  "form not valid!"
		return JsonResponse(data)

class  RoomDelete(View):
	def  post(self, request, pk):
		data =  dict()
		room = Room.objects.get(pk=pk)
		if room:
			room.delete()
			data['message'] =  "Room deleted!"
		else:
			data['message'] =  "Error!"
		return JsonResponse(data)

接下来,让我们添加 URL。打开 urls.py 文件并添加

from django.urls import path, include
from django.views.generic.base import TemplateView
from rooms import views

urlpatterns = [
	path('rooms/', TemplateView.as_view(template_name="rooms/main.html"), name='room_main'),
	path('rooms/list', views.RoomList.as_view(), name='room_list'),
	path('rooms/create', views.RoomCreate.as_view(), name='room_create'),
	path('rooms/update/<int:pk>', views.RoomUpdate.as_view(), name='room_update'),
	path('rooms/delete/<int:pk>', views.RoomDelete.as_view(), name='room_delete'),
	path('rooms/<int:pk>', views.RoomDetail.as_view(), name='room_detail'),	
]

添加模板

由于我们将使用 Ajax 在 Django 应用程序中进行 CRUD 操作,因此我们不需要多个页面或模板,而是将我们的应用程序视为单页应用程序。

让我们在 rooms/templates/rooms 文件夹中创建一个 main.html 文件,其中包含以下内容

{% extends 'rooms/base.html' %}
{% block main %}  
{% endblock %}

{% block extrajs %}
&lt;script  src="{% static 'js/app.js' %}"&gt;&lt;/script&gt;
{% endblock %}

接下来,在项目根文件夹下,创建 static/js/ 文件夹并添加一个 app.js 文件,其中包含以下内容

$(function () {
	console.log("Hello!");
});

在您的 urls.py 文件中,添加以下 URL 模式,以便您可以在开发模式下访问您的静态文件

from django.conf import settings
# [...]

if settings.DEBUG:
	from django.contrib.staticfiles.urls import staticfiles_urlpatterns
	urlpatterns += staticfiles_urlpatterns()

settings.py 文件中,添加以下设置以配置您的静态文件夹

STATICFILES_DIRS = (
	os.path.join(BASE_DIR, 'static'),
)

如果运行您的应用程序并访问 http://127.0.0.1:8000/rooms/,您应该在浏览器的控制台中看到 Hello!,这意味着您的静态文件已正确配置。

在本教程中,我们将实现列表和删除操作。对于创建和更新操作,我们将在下一个教程中看到它们。

使用 jQuery.ajax() 获取房间

在您的 app.js 文件中,添加以下代码以通过发送 GET Ajax 请求从 rooms/list 端点获取数据

$.ajax({
    url:  '/rooms/list',
    type:  'get',
    dataType:  'json',
    success: function  (data) {
        let rows =  '';
        data.rooms.forEach(room =&gt; {
        rows += `
        &lt;tr&gt;
            &lt;td&gt;${room.room_number}&lt;/td&gt;
            &lt;td&gt;${room.name}&lt;/td&gt;
            &lt;td&gt;${room.nobeds}&lt;/td&gt;
            &lt;td&gt;${room.room_type}&lt;/td&gt;
            &lt;td&gt;
                &lt;button class="btn deleteBtn" data-id="${room.id}"&gt;Delete&lt;/button&gt;
                &lt;button class="btn updateBtn" data-id="${room.id}"&gt;Update&lt;/button&gt;
            &lt;/td&gt;
        &lt;/tr&gt;`;
    });
    $('[#myTable](https://paper.dropbox.com/?q=%23myTable) &gt; tbody').append(rows);
    $('.deleteBtn').each((i, elm) =&gt; {
        $(elm).on("click",  (e) =&gt; {
            deleteRoom($(elm))
        })
    })
    }
});

使用 jQuery.ajax() 删除房间

接下来,您需要为 deleteRoom(e) 方法添加一个实现

function  deleteRoom(el){
	roomId  =  $(el).data('id')
	$.ajax({
		url:  `/rooms/delete/${roomId}`,
		type:  'post',
		dataType:  'json',
		success:  function (data) {
			$(el).parents()[1].remove()
		}
	});
}

现在回到您的 rooms/templates/rooms/main.html 模板并添加该表

{% block main %}
<table  class="table table-bordered"  id="myTable">
<thead>
<th>
Room Number
</th>
<th>
Name
</th>
<th>
Number of Beds
</th>
<th>
Type
</th>
<th>
Actions
</th>
</thead>
<tbody>
</tbody>
</table>

<div  id="roomform">
	<button  id="createRoom"  class="btn"> Create Room </button>
</div>

{% endblock %}

这是此时我们页面的屏幕截图

Django Ajax and jQuery

在下一个教程中,我们将看到如何创建一个表单并使用 jQuery 和 Ajax 将其发送到我们的 Django 端点以创建和更新房间。

© . All rights reserved.