Django 基础教程

Django 查询

Django 展示数据

Django Admin

Django 模板

Django 表单组件

Django 高级

Django FAQ

django ajax


在 Django 中使用 Ajax 实现异步请求可以让你的网页更加动态和响应式,而不需要刷新整个页面。下面我将介绍几种常见的在 Django 中使用 Ajax 的方式,并附上相应的步骤和示例代码。

假设我们要实现一个简单的待办事项列表,用户可以添加、删除和标记完成任务。

方式一:使用 Django 内置的 django.views.View 类

步骤流程:

  1. 创建一个 Django 视图,继承自 django.views.View
  2. 在视图中处理 Ajax 请求,根据请求类型返回不同的响应。
  3. 在前端使用 JavaScript 发起 Ajax 请求,并更新页面内容。

示例代码:

创建一个 Django 视图:

# views.py
from django.http import JsonResponse
from django.views import View
from django.shortcuts import render

class TodoListView(View):
    def get(self, request):
        todos = Todo.objects.all()
        return render(request, 'todo_list.html', {'todos': todos})

    def post(self, request):
        task = request.POST.get('task')
        todo = Todo(task=task)
        todo.save()
        return JsonResponse({'message': 'Task added successfully!'})

    def delete(self, request, todo_id):
        todo = Todo.objects.get(pk=todo_id)
        todo.delete()
        return JsonResponse({'message': 'Task deleted successfully!'})

    def patch(self, request, todo_id):
        todo = Todo.objects.get(pk=todo_id)
        todo.completed = True
        todo.save()
        return JsonResponse({'message': 'Task marked as completed!'})

在前端使用 JavaScript 发起 Ajax 请求:

<!-- todo_list.html -->
<ul id="todo-list">
  {% for todo in todos %}
    <li data-todo-id="{{ todo.id }}">
      {{ todo.task }}
      <button class="delete-btn">Delete</button>
      <button class="complete-btn">Complete</button>
    </li>
  {% endfor %}
</ul>

<form id="add-form">
  <input type="text" id="new-task" placeholder="Add a new task">
  <button type="submit">Add</button>
</form>

<script>
document.addEventListener('DOMContentLoaded', function () {
  const todoList = document.getElementById('todo-list');
  const addForm = document.getElementById('add-form');

  // Add a new task
  addForm.addEventListener('submit', function (e) {
    e.preventDefault();
    const newTaskInput = document.getElementById('new-task');
    const task = newTaskInput.value;

    fetch('/add/', {
      method: 'POST',
      body: new URLSearchParams({
        task: task,
        csrfmiddlewaretoken: '{{ csrf_token }}',
      }),
    })
      .then(response => response.json())
      .then(data => {
        // Handle response, e.g., show a success message
        newTaskInput.value = '';
      });
  });

  // Delete a task
  todoList.addEventListener('click', function (e) {
    if (e.target.classList.contains('delete-btn')) {
      const todoId = e.target.parentElement.dataset.todoId;

      fetch(`/delete/${todoId}/`, {
        method: 'DELETE',
        headers: {
          'X-CSRFToken': '{{ csrf_token }}',
        },
      })
        .then(response => response.json())
        .then(data => {
          // Handle response, e.g., remove the task from the list
        });
    }
  });

  // Mark task as completed
  todoList.addEventListener('click', function (e) {
    if (e.target.classList.contains('complete-btn')) {
      const todoId = e.target.parentElement.dataset.todoId;

      fetch(`/complete/${todoId}/`, {
        method: 'PATCH',
        headers: {
          'X-CSRFToken': '{{ csrf_token }}',
        },
      })
        .then(response => response.json())
        .then(data => {
          // Handle response, e.g., update the task's appearance
        });
    }
  });
});
</script>

这个示例中,我们使用了 django.views.View 来处理不同类型的 Ajax 请求。在前端,我们使用了 JavaScript 来发起异步请求,然后根据响应更新页面内容。

请注意,上述示例代码中使用了 Django 模板引擎的语法(如 {{ csrf_token }})来生成 CSRF 令牌,并且需要在视图中导入相应的模型(Todo )和其他依赖项。具体实现可能需要根据你的项目结构进行适当的调整。

方式二:使用 django-rest-framework

django-rest-framework 是一个用于构建 Web API 的强大框架,它也可以用于处理 Ajax 请求。

步骤流程:

  1. 安装 django-rest-framework
  2. 创建序列化器(Serializer)来定义数据的序列化和反序列化。
  3. 创建 API 视图,继承自 rest_framework.views.APIView,处理 Ajax 请求。
  4. 在前端使用 JavaScript 发起 Ajax 请求,并更新页面内容。

示例代码:

安装和配置 django-rest-framework:

首先,你需要安装 djangorestframework 包,然后将它添加到你的 Django 项目的 INSTALLED_APPS 中。执行以下命令:

pip install djangorestframework

在你的项目的 settings.py 中添加:

INSTALLED_APPS = [
    # ...
    'rest_framework',
    # ...
]

创建序列化器:

# serializers.py
from rest_framework import serializers
from .models import Todo

class TodoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Todo
        fields = '__all__'

创建 API 视图:

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Todo
from .serializers import TodoSerializer

class TodoListAPIView(APIView):
    def get(self, request):
        todos = Todo.objects.all()
        serializer = TodoSerializer(todos, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = TodoSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, todo_id):
        todo = Todo.objects.get(pk=todo_id)
        todo.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

    def patch(self, request, todo_id):
        todo = Todo.objects.get(pk=todo_id)
        todo.completed = True
        todo.save()
        return Response(status=status.HTTP_200_OK)
Ajax(AsynchronousJavaScriptandXML)是一种用于在Web应用程序中实现异步通信的技术,它允许客户端通过Java ...
ajax()`函数可以很方便地在Django中实现使用Ajax提交表单数据。###代码示例及解释说明前端代码(HTML+JavaScript ...
###方式一:使用常规的Django视图和模板渲染方式一简要描述:通过Django的视图和模板系统来渲染页面内容,然后使用AJAX请求更新部 ...
当谈到Pythonweb开发框架时,Django是一个非常流行和强大的选择。MVC架构:Django使用MTV(模型、模板、视图)模式,类似 ...
Django和Flask都是用于构建Web应用程序的PythonWeb框架,但它们在设计哲学、功能和用途上有一些明显的区别。学习曲线和开发速 ...