将表单添加到 Django DetailView 错误消息:不允许的方法(POST)

Posted

技术标签:

【中文标题】将表单添加到 Django DetailView 错误消息:不允许的方法(POST)【英文标题】:Adding forms to Django DetailView ERROR message:Method Not Allowed (POST) 【发布时间】:2018-11-06 07:45:08 【问题描述】:

您好 Djangonauts,我正在尝试构建一个问答类型的应用程序,例如“***”或“Quora”我是 Django 新手。所以请原谅逻辑或代码中的任何愚蠢错误。以下是我的错误

之前:我制作了问答应用程序,它运行良好。问题详情页面有问题和回答按钮,让用户回答问题。当用户点击按钮时,他会转到一个新的“answer_form.html”写下他的答案并点击Save他的答案然后显示在问题详细信息页面中。到这里一切正常

问题:现在我不希望用户离开问题详细信息页面发布他的答案,我使用 javascript 使 answer_form 出现在问题详细信息页面上,但是现在当用户点击Save我得到一个错误

This page isn’t working
If the problem continues, contact the site owner.
HTTP ERROR 405 

如何解决此错误。我相信很多人不希望人们离开详细信息页面来评论帖子或回答问题。以下是我的观点和模板详情

views.py

class AnswerCreate(LoginRequiredMixin, CreateView):
    model = Answer
    form_class = AnswerForm

    def form_valid(self, form, *args, **kwargs):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        slug = self.kwargs.get('slug')
        print(slug)
        self.object.question = get_object_or_404(Question, slug=slug)
        self.object.save()
        return super().form_valid(form) 

以下是我的 forms.py

class AnswerForm(forms.ModelForm):

    class Meta:
        model = Answer
        fields = ('text', 'answer_image', 'answer_image2')

下面是我的question_detail.html模板

 <div class="container-fluid" id="answ" style="display:none">
        <div class="form-group row">
             field.errors
            <form action="" method="post" enctype="multipart/form-data">
                % csrf_token %
                % bootstrap_form form2 %
                <input type="submit" value="Save" class="btn btn-primary" />
                <button type="button" onclick="document.getElementById('answ').style.display='none'"
                        class="btn btn-default">Cancel</button> # To hide the form
            </form>
        </div>
    </div>

这是模板中显示表单的按钮

      <a class="btn btn-primary btn-sm col-sm-2"
onclick="document.getElementById('answ').style.display='block'">Answer</a>

在这个按钮看起来像这样并且一切正常之前:

<a href="% url 'questions:add_answer' username=question.user.username slug=question.slug %>Answer</a>

以下是我的 Urls.py

url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/add_answer/$', views.AnswerCreate.as_view(), name='add_answer'),

下面是 QuestionDetail 的 view.py

class QuestionDetail(SelectRelatedMixin, DetailView):
    model = Question
    select_related = ('user', 'group')

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user__username__iexact=self.kwargs.get('username'))

    def get_context_data(self, **kwargs):
        context = super(QuestionDetail, self).get_context_data(**kwargs)
        context['form2'] = AnswerForm
        return context

下面是QuestionDetail的URL

 url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/$', views.QuestionDetail.as_view(), name='single'),

【问题讨论】:

您的表单似乎没有提交到正确的视图。你提到了一个 DetailView - 是什么呈现了 question_detail 模板?如果是这样,您需要发布该视图及其 URL。 @DanielRoseman 很抱歉我错过了。我已将viewurl 上面的QuestionDetail 添加到我的问题中 【参考方案1】:

您知道如何创建 URL 以让您的表单提交到您的 CreateView,但您没有使用它;您在 HTML 表单元素中有一个空的action,因此它只会提交回同一个 DetailView。您需要在action 属性中使用% url % 标记,以便表单提交到正确的位置。

您可能还想在 CreateView 中定义 get_success_url(),以便它重定向回 DetailView。

【讨论】:

它有效,通常我们不会在 answer_form.html 中添加它,所以我忘了它。非常感谢

以上是关于将表单添加到 Django DetailView 错误消息:不允许的方法(POST)的主要内容,如果未能解决你的问题,请参考以下文章

尝试将表单添加到 DetailView

Django - 使用 DetailView 创建视图

Django:在通用 DetailView 中实现表单

在 Django 的 DetailView 中将表单字段设置为对象 ID

Django 通用视图:何时使用 ListView 与 DetailView

表单验证重定向问题