用Django和AJAX创建一个待办事项应用

2025-04-10T13:32:54+08:00 | 2分钟阅读 | 更新于 2025-04-10T13:32:54+08:00

Macro Zhao

推荐超级课程:

@TOC

让我们创建一个简单的 Django 项目,其中包含不同类型的 AJAX 请求示例,例如 GET、POST、PUT 和 DELETE。在这个示例中,我们将创建一个简单的待办事项列表应用程序,用户可以使用 AJAX 添加、编辑、删除和标记任务为完成。 首先,确保您已安装 Django。您可以使用 pip 安装它:

pip install django

让我们创建一个新的 Django 项目称为 “todo_project” 和一个 Django 应用程序称为 “todo_app”。

django-admin startproject todo_project  
cd todo_project  
python manage.py startapp todo_app

现在,让我们为待办事项应用程序定义模型、视图和 URL。 在 todo_app/models.py 中:

from django.db import models  
class TodoItem(models.Model):  
    title = models.CharField(max_length=200)  
    completed = models.BooleanField(default=False)  
    def __str__(self):  
        return self.title

初始化数据库:

python manage.py migrate
  • 此命令根据您的 Django 应用程序中定义的模型创建必要的数据库表。它查看每个应用中的 models.py 文件并创建相应的数据库模式。 创建初始迁移:
python manage.py makemigrations

此命令检查您模型的当前状态,并在 todo_app/migrations/ 目录中创建迁移文件。这些文件包含根据您模型中的更改更新数据库模式的指令。 应用迁移:

python manage.py migrate

此命令执行迁移,将更改应用于数据库模式。它读取在 makemigrations 步骤中创建的迁移文件,并相应地更新数据库。 创建一个超级用户以访问 Django 管理界面:

python manage.py createsuperuser

按照提示设置用户名、电子邮件和密码。 在 todo_app 目录中创建一个 templates 文件夹,并将 todo_list.html 放置在 templates/todo_app/ 中。 在 todo_app/views.py 中,定义用于显示待办事项列表、添加、更新和删除待办事项的视图。相应地更新同一目录中的 urls.py

from django.shortcuts import render, HttpResponse, get_object_or_404  
from django.views.decorators.csrf import csrf_exempt  
from django.http import JsonResponse  
from .models import TodoItem  
import json  
def todo_list(request):  
    todos = TodoItem.objects.all()  
    return render(request, 'todo_app/todo_list.html', {'todos': todos})  
@csrf_exempt  
def add_todo(request):  
    if request.method == 'POST':  
        data = json.loads(request.body)  
        title = data['title']  
        todo = TodoItem.objects.create(title=title)  
        return JsonResponse({'id': todo.id, 'title': todo.title, 'completed': todo.completed})  
@csrf_exempt  
def update_todo(request, todo_id):  
    todo = get_object_or_404(TodoItem, pk=todo_id)  
    if request.method == 'PUT':  
        data = json.loads(request.body)  
        completed = data['completed']  
        todo.completed = completed  
        todo.save()  
        return JsonResponse({'id': todo.id, 'completed': todo.completed})  
@csrf_exempt  
def delete_todo(request, todo_id):  
    todo = get_object_or_404(TodoItem, pk=todo_id)  
    if request.method == 'DELETE':  
        todo.delete()  
        return HttpResponse(status=204)

todo_project/urls.py 中:

from django.contrib import admin  
from django.urls import path, include  
urlpatterns = [
    path('admin/', admin.site.urls),  
    path('', include('todo_app.urls')),  
]

todo_app/urls.py 中:

from django.urls import path  
from . import views  
urlpatterns = [
    path('', views.todo_list, name='todo_list'),  
    path('add/', views.add_todo, name='add_todo'),  
    path('update/<int:todo_id>/', views.update_todo, name='update_todo'),  
    path('delete/<int:todo_id>/', views.delete_todo, name='delete_todo'),  
]

现在,让我们为待办事项应用程序创建模板。在 todo_app/templates/todo_app/todo_list.html 中:

<!DOCTYPE html>  
<html>  
<head>  
    <title>Todo List</title>  
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>  
</head>  
<body>  
    <h1>Todo List</h1>  
      
    <input type="text" id="todo-input" placeholder="Add new todo">  
    <button id="add-todo">Add Todo</button> <br>  
    {% comment %} todo list here {% endcomment %}  
    <ul id="todo-list">  
        {% for todo in todos %}  
            <li id="todo-{{ todo.id }}">  
                <input type="checkbox" class="todo-checkbox" {% if todo.completed %}checked{% endif %}>  
                <span class="todo-title">{{ todo.title }}</span>  
                <button class="delete-todo" data-id="{{ todo.id }}">Delete</button>  
            </li>  
        {% endfor %}  
    </ul>  
  
    <script>  
        $(document).ready(function() {  
            $('#add-todo').click(function() {  
                var title = $('#todo-input').val();  
                $.ajax({  
                    url: "{% url 'add_todo' %}",  
                    type: "POST",  
                    contentType: "application/json",  
                    data: JSON.stringify({title: title}),  
                    success: function(data) {  
                        $('#todo-list').append(`<li id="todo-${data.id}">  
                            <input type="checkbox" class="todo-checkbox">  
                            <span class="todo-title">${data.title}</span>  
                            <button class="delete-todo" data-id="${data.id}">Delete</button>  
                        </li>`);  
                    }  
                });  
            });  
  
            $('.delete-todo').click(function() {  
                var id = $(this).data('id');  
                $.ajax({  
                    url: `/delete/${id}/`,  
                    type: "DELETE",  
                    success: function() {  
                        $(`#todo-${id}`).remove();  
                    }  
                });  
            });  
  
            $('.todo-checkbox').change(function() {  
                var id = $(this).closest('li').attr('id').split('-')[1];  
                var completed = $(this).is(':checked');  
                $.ajax({  
                    url: `/update/${id}/`,  
                    type: "PUT",  
                    contentType: "application/json",  
                    data: JSON.stringify({completed: completed}),  
                    success: function(data) {  
                        alert('Successfully Updated!');  
                    }  
                });  
            });  
        });  
    </script>  
</body>  
</html>

现在,让我们运行我们的 Django 服务器:

python manage.py runserver

现在,您可以访问 http://127.0.0.1:8000/ 来查看您的待办事项列表应用程序。您可以使用 AJAX 请求添加待办事项、删除它们并将它们标记为完成!

© 2011 - 2025 Macro Zhao的分享站

关于我

如遇到加载502错误,请尝试刷新😄

Hi,欢迎访问 Macro Zhao 的博客。Macro Zhao(或 Macro)是我在互联网上经常使用的名字。

我是一个热衷于技术探索和分享的IT工程师,在这里我会记录分享一些关于技术、工作和生活上的事情。

我的CSDN博客:
https://macro-zhao.blog.csdn.net/

欢迎你通过评论或者邮件与我交流。
Mail Me

推荐好玩(You'll Like)
  • AI 动·画
    • 这是一款有趣·免费的能让您画的画中的角色动起来的AI工具。
    • 支持几十种动作生成。
我的项目(My Projects)
  • 爱学习网

  • 小乙日语App

    • 这是一个帮助日语学习者学习日语的App。
      (当然初衷也是为了自用😄)
    • 界面干净,简洁,漂亮!
    • 其中包含 N1 + N2 的全部单词和语法。
    • 不需注册,更不需要订阅!完全免费!
  • 小乙日文阅读器

    • 词汇不够?照样能读日语名著!
    • 越读积累越多,积跬步致千里!
    • 哪里不会点哪里!妈妈再也不担心我读不了原版读物了!
赞助我(Sponsor Me)

如果你喜欢我的作品或者发现它们对你有所帮助,可以考虑给我买一杯咖啡 ☕️。这将激励我在未来创作和分享更多的项目和技术。🦾

👉 请我喝一杯咖啡

If you like my works or find them helpful, please consider buying me a cup of coffee ☕️. It inspires me to create and share more projects in the future. 🦾

👉 Buy me a coffee