Добавление форм в сообщение Django DetailView ERROR: метод не разрешен (POST) - PullRequest
0 голосов
/ 27 мая 2018

Привет, Djangonauts. Я пытаюсь создать приложение типа Вопрос и Ответ, такое как «StackOverflow» или «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'),

Конечно ниже view.py для QuestionDetail

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 для QuestionDetail

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

1 Ответ

0 голосов
/ 27 мая 2018

Вы знаете, как создать URL-адрес для отправки формы в CreateView, но вы ее не используете;у вас есть пустой action в элементе формы HTML, поэтому он просто отправляется обратно в тот же DetailView.Вам необходимо использовать этот тег {% url %} в атрибуте action, чтобы форма отправлялась в нужное место.

Возможно, вы также захотите определить get_success_url() в своем CreateView, чтобы он перенаправлял обратно вDetailView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...