Django 表单提交出现 405 错误

2 投票
3 回答
2286 浏览
提问于 2025-04-17 22:48

我正在尝试在我的类视图中显示一个表单,并处理表单的提交。

我没有使用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 的人,因为他们并不是在处理创建模型对象,只是想用 TemplateViewFormMixin 来管理与实际模型无关的表单,你需要明白,这种组合没有实现 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)

然后你可以使用 postform_valid 方法来处理提交的动作。

能够做到这一点的是 ProcessFormView,它会让你的视图支持 POST 方法。

1

我想问题出在你的视图上。因为你使用了FormMixin和DetailView这两个类,但它们都没有实现POST方法,所以Django返回了405错误代码。你可以试着使用UpdateView或CreateView来支持POST功能。

撰写回答