Кнопка "Отправить" в шаблоне приводит к ошибке HTTP 405 - PullRequest
0 голосов
/ 26 мая 2020

Я добавляю раздел комментариев для своих сообщений, проблема заключается в том, что после отправки это приводит к HTTP ERROR 405 Это первый раз, когда появляется эта ошибка, я просматривал просмотры несколько раз, но я думаю, что ошибка может быть связана с views.py в подробном представлении сообщения

class PostDetailView(DetailView):
    model = Post
    template_name = "post_detail.html"

    def get_context_data(self, *args, **kwargs):
        context = super(PostDetailView, self).get_context_data()
        post = get_object_or_404(Post, slug=self.kwargs['slug'])
        comments = Comment.objects.filter(post=post).order_by('-id')
        total_likes = post.total_likes()
        liked = False
        if post.likes.filter(id=self.request.user.id).exists():
            liked = True

        if self.request.method == 'POST':
            comment_form = CommentForm(self.request.POST or None)
            if comment_form.is_valid():
                content = self.request.POST.get('content')
                comment = Comment.objects.create(
                    post=post, user=request.user, content=content)
                comment.save()
                return HttpResponseRedirect("post_detail.html")
        else:
            comment_form = CommentForm()

        context["total_likes"] = total_likes
        context["liked"] = liked
        context["comments"] = comments
        context["comment_form"] = comment_form
        return context

вот шаблон

            <form method="post" class="comment-form" action=".">
            {% csrf_token %}
            {{ comment_form.as_p }}
            {% if request.user.is_authenticated %}
            <input type="submit" value="Submit" class="btn btn-outline-success">
            {% else %}
            <input type="submit" value="Submit" class="btn btn-outline-success" disabled> You must be Logged in to Comment
            {% endif %}
            </form>
            <div class="main-comment-section">
            {{comments.count}} Comment{{comments|pluralize}}
            {% for comment in comments %}
            <blockquote class="blockquote">
                <p class="mb-0"> {{ comment.content}}</p>
                <footer class="blockquote-footer">by<cite title="Source Title">{{comment.user| capfirst}}</cite></footer>
            </blockquote>
            {% endfor %}

вот комментарии models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField(max_length=160)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '{}-{}'.format(self.post.title, str(self.user.username))

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Как я понял, вам нужно обновить sh страницу, чтобы отображались результаты. Я бы посоветовал использовать для этого вызов AJAX. Кроме того, вам нужно вернуть context, а не http response.

class PostDetail(CsrfExemptMixin, JSONResponseMixin,AjaxResponseMixin):
    def post_ajax(self, request, *args, **kwargs):
                comment_form = CommentForm(request.POST or None)
                if comment_form.is_valid():
                    content = request.POST.get('content')
                    comment = Comment.objects.create(
                        post=post, user=request.user, content=content)
                    comment.save()
                                return self.render_json_response({'comment': comment})
0 голосов
/ 26 мая 2020

выполнение POST запроса на DetailView приведет к такому ответу, поскольку он реализует только метод get() и предназначен для использования только для отображения данных

У вас будет чтобы сделать шаг назад, чтобы понять представления на основе классов (у них есть методы для каждого типа запроса get () post () et c.)

После выполнения вы можете сделать шаг к пониманию generi c представления на основе классов

Вероятно, вы хотели использовать FormView вместо

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