Django测验项目点击+按钮出现405错误,无法添加问题
解决Django添加问题时的405 Method Not Allowed错误
问题根源
你的QuestionView类仅实现了get()方法,Django类视图会根据请求方法匹配对应的处理函数。当页面发送POST请求时,视图没有对应的post()方法处理该请求,因此返回405错误。另外你在get()方法内判断request.method == "POST"是无效的——get()方法只会处理GET类型的请求,POST请求根本不会进入这个方法。
修复步骤
1. 修改views.py,添加POST请求处理
将创建问题的逻辑移到单独的post()方法中,处理完成后重定向回原页面(遵循POST/REDIRECT/GET模式,避免刷新重复提交):
from django.shortcuts import render, redirect from django.views import View from .models import Question class QuestionView(View): def get(self, request): all_items = Question.objects.all() return render(request, "questionmanager.html", {'all_items': all_items}) def post(self, request): # 处理POST请求,创建新问题 item_name = request.POST.get('itemName') if item_name: # 简单校验输入不为空 Question.objects.create(name=item_name) # 重定向回GET请求页面,避免刷新重复提交 return redirect('question')
2. 优化前端fetch请求(可选)
原代码中window.location.reload()会立即执行,可能在POST请求还未完成时就刷新页面,导致新添加的问题可能不显示。可以修改为请求成功后再刷新:
function addQuestion(){ let itemName = prompt('Add new question'); if (!itemName) return; // 用户取消输入时直接返回 let token = "{{ csrf_token }}"; let formData=new FormData(); formData.append('itemName', itemName); formData.append("csrfmiddlewaretoken", token); fetch('/question/', { method: 'POST', body: formData }) .then(response => { if (response.ok) { window.location.reload(); } else { alert('添加失败,请重试'); } }) .catch(error => { console.error('请求错误:', error); alert('添加失败,请重试'); }); }
额外建议
可以在模型中添加__str__方法,方便后台管理查看问题内容:
class Question(models.Model): created_at=models.DateField(default=date.today) name=models.CharField(max_length=200) done=models.BooleanField(default=False) def __str__(self): return self.name
内容的提问来源于stack exchange,提问作者Davidcopperfield
相关产品推荐
相关产品推荐

