Django 表单提交出现 405 错误
我正在尝试在我的类视图中显示一个表单,并处理表单的提交。
我没有使用Django自带的表单,因为那样会破坏我的设计。
这是我的表单代码:
<form action="." method="POST" >
<input type='hidden' name='pf_id' value='{{pf.id}}' />
<input type='hidden' name='content_type' value='portfolio' />
<textarea id="id_comment" name="comment"></textarea>
<section><input type="submit" value="submit" name="commentSubmit" class="comment-button" title="submit" class="comment-button" /></section>
</form>
在 views.py
文件中:
class ProjectDetailView(FormMixin, DetailView):
template_name = 'account/inner-profile-page.html'
model = ProjectDetail
context_object_name = 'project'
def get_object(self, queryset=None):
return get_object_or_404(ProjectDetail, title_slug = self.kwargs['title_slug'])
def get_context_data(self, **kwargs):
context = super(ProjectDetailView, self).get_context_data(**kwargs)
projects = []
for st in SubType.objects.all():
user = self.get_object().user
pd = ProjectDetail.objects.filter(user=user,project_sub_type__sub_type=st)
if pd.count() > 0:
projects.append((st.name, pd.count()))
context['projects'] = projects
return context
def post(self, request, *args, **kwargs):
import pdb;pdb.set_trace()
我希望在提交表单时能够调用POST方法(我希望我的想法是对的),但是实际上并没有。提交这个表单后,我被带到了一个空白页面。网址没有变化,而我在运行服务器的控制台中收到了405错误信息。为什么会这样呢?我的网址设置是这样的:
url(r'^project-detail/(?P<title_slug>\w+)/$',ProjectDetailView.as_view(), name="project-detail-view"),
url(r'^project-page/(?P<user_slug>.+)/$',projectPage.as_view(),name='projectPage'),
3 个回答
0
最好的解决方案是:
success_url = reverse_lazy(your_path)
你还需要从 django.urls
导入 reverse_lazy
,可以这样做:
from django.urls import reverse_lazy
0
对于那些不想使用 CreateView
的人,因为他们并不是在处理创建模型对象,只是想用 TemplateView
和 FormMixin
来管理与实际模型无关的表单,你需要明白,这种组合没有实现 POST
方法。
如果你真的想用类视图(CBV)来实现这个功能,你需要像下面这样定义你的表单:
class ProjectDetailView(FormMixin, DetailView, ProcessFormView):
#Your code here
def form_valid(self, form):
return super().form_valid(form)
def post(self, request, *args, **kwargs):
return super().post(request, *args, **kwargs)
然后你可以使用 post
或 form_valid
方法来处理提交的动作。
能够做到这一点的是 ProcessFormView
,它会让你的视图支持 POST
方法。
1
我想问题出在你的视图上。因为你使用了FormMixin和DetailView这两个类,但它们都没有实现POST方法,所以Django返回了405错误代码。你可以试着使用UpdateView或CreateView来支持POST功能。