You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django待办清单勾选按钮失效排查请求(新手友好)

Hey there! Let's walk through this step by step since you're new to Django—no confusing jargon, just straightforward checks and fixes for your todo toggle button issue.

First: Check Your Template (HTML) Implementation

Most often, the problem here is how you're submitting the toggle action. Django requires POST requests for modifying data, and you need to include a CSRF token to avoid security blocks. If you're using a plain button or link without these, it'll just refresh the page without doing anything.

Here's a correct example of how to structure your toggle button in the template:

<!-- Assuming each todo item is in a loop like {% for todo in todos %} -->
<form method="POST" action="{% url 'toggle_todo' todo.id %}">
    {% csrf_token %}
    <button type="submit">
        {% if todo.completed %}Unmark as Done{% else %}Mark as Done{% endif %}
    </button>
</form>
  • Make sure the action uses the correct URL name we'll set up next.
  • Don't skip the {% csrf_token %}—Django will silently block POST requests without it (check your browser's dev tools (F12) > Network tab if you see a 403 error).

Second: Verify Your URL Configuration

Your URL needs to map to a view that handles the toggle, and it should capture the todo item's ID. Add this to your app's urls.py:

from django.urls import path
from . import views

urlpatterns = [
    # ... your other URLs (like the todo list page)
    path('todo/toggle/<int:todo_id>/', views.toggle_todo, name='toggle_todo'),
]
  • The <int:todo_id> captures the todo's ID and passes it to the view.
  • The name='toggle_todo' matches what we used in the template's {% url %} tag.

Third: Fix Your View Function

Your view needs to explicitly handle the POST request, toggle the boolean value, save the change, and redirect back to your todo list. Here's a working example:

from django.shortcuts import get_object_or_404, redirect
from .models import Todo

def toggle_todo(request, todo_id):
    # Only process POST requests (GET should not modify data)
    if request.method == 'POST':
        # Get the todo item, or return a 404 if it doesn't exist
        todo = get_object_or_404(Todo, id=todo_id)
        # Toggle the completed status (more flexible than hardcoding True)
        todo.completed = not todo.completed
        # Save the change to the database—don't forget this step!
        todo.save()
        # Redirect back to your todo list page (replace 'todo_list' with your actual URL name)
        return redirect('todo_list')
    # If someone accidentally uses GET, just send them back to the list
    return redirect('todo_list')
  • Common mistakes here: forgetting to check request.method, not calling todo.save(), or not redirecting (which can cause duplicate submissions if the user refreshes).

Fourth: Double-Check Your Model

Make sure your completed field is set up correctly as a BooleanField with a sensible default:

from django.db import models

class Todo(models.Model):
    title = models.CharField(max_length=200)
    # BooleanField with default False (uncompleted)
    completed = models.BooleanField(default=False)
    # Add any other fields you need (like created_at)

    def __str__(self):
        return self.title

Quick Troubleshooting Tips

  1. Check browser dev tools: Open F12 > Network tab, click your toggle button, and look at the request status. A 403 means missing CSRF token; a 404 means your URL/view is misconfigured.
  2. Verify the view is being called: Add a print("Toggle view called!") inside the view function and check your command line terminal—if it doesn't show up, your URL isn't mapped correctly.
  3. Test the model directly: In the Django shell (python manage.py shell), try creating a todo, toggling its completed status, saving it, and checking if the change sticks. This will rule out model issues.

Content of the question comes from stack exchange, question author: Maxim_Zulu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:54:54