【问题标题】:Django formsubmission gives me a 405 errorDjango 表单提交给我一个 405 错误
【发布时间】:2014-03-18 11:10:08
【问题描述】:

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

我没有使用 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 方法(希望我的假设是正确的),但事实并非如此,因为提交此表单会将我带到一个空白页面。 URL 没有改变,我在 runserver shell 中收到 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'),

【问题讨论】:

  • 您需要回复def post
  • @PriyankPatel:然而post 根本没有被称为
  • 表单 URL 是否与ProjectDetailView URL 相同?例如是project-detail/some_title/吗?
  • 动作似乎不对。不应该只是"" 发布到当前页面吗?

标签: python django forms


【解决方案1】:

我想问题出在你的观点上。由于您继承了 FormMixin 和 DetailView 都没有实现 POST 方法,因此 django 返回 405 错误代码。尝试继承 updateview 或 createview 以支持发布功能。

【讨论】:

  • 除了他自己在ProjectDetailView中实现post
  • 但使用 django.views.generic.UpdateView 而不是 DetailView 可能更有意义 - 因为它还为您提供了一些处理表单处理的方法。
【解决方案2】:

对于那些不想使用CreateView 因为他们不处理创建模型对象而只想使用TemplateViewFormMixin 来管理与实际模型无关的表单的人,你需要要了解这种组合没有POSTmethod 实现。

如果你真的想用 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 方法。

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2015-08-23
    • 2019-06-20
    • 2016-07-14
    • 2017-05-03
    • 2016-06-22
    相关资源
    最近更新 更多