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

时间:2018-05-27 16:15:18

标签: django python-3.x django-forms django-templates django-views

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

之前:我提出问题并回答应用程序,它运行正常。问题详细信息页面有问题和答案按钮,让用户回答问题。当用户点击按钮时,他会转到新的" Save"写下他的答案并点击answer_form他的答案随后显示在问题详情页面中。直到这里一切正常

问题:现在我不希望用户在问题详情页面上留下他的答案,我使用JavaScript让Save出现在问题详细信息上页面,但现在当用户点击This page isn’t working If the problem continues, contact the site owner. HTTP ERROR 405 时出现错误

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) 

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

views.py

class AnswerForm(forms.ModelForm):

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

以下是 forms.py

 <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>

以下是我的 question_detail.html模板

      <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>

此按钮看起来像这样,一切正常:

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

以下是 Urls.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的 view.py

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

下面是QuestionDetail的网址

{{1}}

1 个答案:

答案 0 :(得分:2)

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

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