使用Django自定义表单保存数据时遇Error 405方法不允许问题
Django 自定义表单提交出现405 Method Not Allowed错误的解决方案
核心问题
你的CreateEstablishmentView类仅实现了get方法,而你编写的post方法是独立的全局函数,并未作为类的成员方法存在。这导致当POST请求发送到/create-establishment/时,类视图没有对应的处理逻辑,直接返回405不允许方法错误。
修正后的视图代码
将post方法移入CreateEstablishmentView类内部,让类视图同时支持GET和POST请求:
class CreateEstablishmentView(TemplateView): def get(self, request): form = CustomEstablishmentRegistrationForm() return render(request, 'create_establishment.html', {'form': form}) # 将post方法移到类内部 def post(self, request): form = CustomEstablishmentRegistrationForm(request.POST) if form.is_valid(): establishment = form.save() return redirect('establishment_detail', pk=establishment.pk) return render(request, 'create_establishment.html', {'form': form}) class EstablishmentDetailView(TemplateView): template_name = "establishment_detail.html" def establishment_detail(request, pk): establishment = Establishments.objects.get(pk=pk) return render(request, 'establishment_detail.html', {'establishment': establishment})
更简洁的优化方案:使用FormView
Django提供了FormView通用视图,专门用于处理表单的展示和提交逻辑,无需手动编写get/post方法:
from django.views.generic.edit import FormView from django.urls import reverse class CreateEstablishmentView(FormView): form_class = CustomEstablishmentRegistrationForm template_name = 'create_establishment.html' def form_valid(self, form): # 表单验证通过时保存数据 self.establishment = form.save() return super().form_valid(form) def get_success_url(self): # 提交成功后跳转到详情页 return reverse('establishment_detail', kwargs={'pk': self.establishment.pk})
额外检查项
确保你的HTML表单满足以下要求:
- 表单的
method属性设置为POST - 包含
{% csrf_token %}标签(Django强制要求的CSRF防护) action属性指向正确的URL(可使用{% url 'create-establishment' %}自动生成)
示例表单代码:
<form method="POST" action="{% url 'create-establishment' %}"> {% csrf_token %} {{ form.as_p }} <button type="submit">提交</button> </form>
内容的提问来源于stack exchange,提问作者Aquaknight
相关产品推荐
相关产品推荐

