代码之家  ›  专栏  ›  技术社区  ›  Samir Tendulkar

向django detailview添加表单错误消息:不允许使用方法(post)

  •  1
  • Samir Tendulkar  · 技术社区  · 8 年前

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

    之前: 我做了问答程序,效果很好。问题详细信息页面有一个问题和一个回答按钮,允许用户回答问题。当用户单击按钮时,他将转到一个新的“ answer_form.html “写下答案并点击 Save 他的答案会显示在问题详细页面中。到这里一切都很好

    问题是: 现在我不希望用户离开问题详细信息页面发布他的答案,我使用javascript使 answer_form 但现在当用户单击 保存 我出错了

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

    我如何修复这个错误。我相信很多人不希望人们离开细节页面来评论文章或回答问题。以下是我的视图和模板详细信息

    视图.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) 
    

    下面是我的 表格.py

    class AnswerForm(forms.ModelForm):
    
        class Meta:
            model = Answer
            fields = ('text', 'answer_image', 'answer_image2')
    

    下面是我的 问题\u 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>
    

    下面是我的 网址.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
    

    下面是 问题详细信息的URL

     url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/$', views.QuestionDetail.as_view(), name='single'),
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Daniel Roseman    8 年前

    您知道如何创建URL以使表单提交到您的CreateView,但您没有使用它;您有一个空的 action 在HTML表单元素中,这样它将只提交回相同的详细视图。你需要用那个 {% url %} 在中标记 行动 属性,以便表单提交到正确的位置。

    您可能还需要定义 get_success_url() 在您的createView中,以便它重定向回detailview。

    推荐文章