Django待办应用编辑表单提交报错:MultiValueDictKeyError: 'category'
Django待办应用编辑任务时出现
MultiValueDictKeyError: 'category'的解决办法 核心原因
直接用request.POST['category']这种索引方式取值时,若POST数据里不存在该字段(或字段未被正确提交),就会触发MultiValueDictKeyError。即便你核对了表单name属性,仍可能因字段未传递、默认值问题或表单渲染异常导致错误。
快速修复:改用request.POST.get()方法
把视图中直接索引POST数据的代码换成get()方法,该方法允许设置默认值,从根源避免报错:
def edit(request, task_id): task = get_object_or_404(Task, id=task_id) if request.method == 'POST': print(request.POST) # 务必查看输出是否包含'category'和'importancy' # 用get方法取值,字段不存在时保留任务原有值 task.category = request.POST.get('category', task.category) task.importancy = request.POST.get('importancy', task.importancy) task.save() return redirect('todo:index') return render(request, 'todo/edit.html', {'task': task})
进一步排查方向
检查POST输出:查看
print(request.POST)的结果,如果输出里没有category字段,需确认:- 模板中input的
name属性是否确实为category(查看页面源码,避免拼写错误) - Task模型中是否存在
category字段,字段名拼写是否和模板、视图一致 - 任务对象的
category值是否为None,导致渲染input时出现异常(可临时在模板中添加{{ task.category }}确认值是否存在)
- 模板中input的
推荐使用Django Form类(更安全规范)
手动处理POST数据容易出错,建议用Django的ModelForm封装表单逻辑,自动处理验证和字段赋值:
第一步:在forms.py中定义表单类
from django import forms from .models import Task class TaskEditForm(forms.ModelForm): class Meta: model = Task fields = ['category', 'importancy']
第二步:修改视图代码
from django.shortcuts import render, redirect, get_object_or_404 from .models import Task from .forms import TaskEditForm def edit(request, task_id): task = get_object_or_404(Task, id=task_id) if request.method == 'POST': form = TaskEditForm(request.POST, instance=task) if form.is_valid(): form.save() return redirect('todo:index') else: form = TaskEditForm(instance=task) return render(request, 'todo/edit.html', {'task': task, 'form': form})
第三步:更新模板(自动渲染表单字段)
{% block content %} <h2>Edit Task</h2> <form action="{% url 'todo:edit' task.id %}" method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" value="Edit"> </form> {% endblock content %}
内容的提问来源于stack exchange,提问作者REDA
相关产品推荐
相关产品推荐

