При сохранении комментария под статьей возвращается 404 страница не найдена

Я пытаюсь добавить комментарии на страницу блога, который я создаю. У меня есть модель комментариев, которая имеет id поста в качестве внешнего ключа, а также пользователя, потому что я хочу позволить только пользователям комментировать.

class Comment(models.Model):
    post = models.ForeignKey(
        Article, on_delete=models.CASCADE, related_name='comments')
    name = models.ForeignKey(
        User, blank=True, null=True, on_delete=models.SET_NULL)
    email = models.EmailField()
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)

    class Meta:
        ordering = ['created_on']

Однако при сохранении возвращается ошибка 404.

Not Found: /articles/this-is-first-article/
[05/Nov/2021 16:51:05] "POST /articles/this-is-first-article/ HTTP/1.1" 404 2912

Вот мои урлы:

app_name = 'articles'
urlpatterns = [
    path('', article_search_view, name='search'),
    path('create/', article_create_view, name='create'),
    path('<slug:slug>/', article_detail_view, name='detail'),
]

А вот мое мнение:

def article_detail_view(request, slug=None):
    article_obj = None
    new_comment = None
    comments = None
    comment_form = None
    if slug is not None:
        try:
            article_obj = Article.objects.get(slug=slug)
            comments = article_obj.comments.filter(active=True)
            if request.method == 'POST':
                comment_form = CommentForm(data=request.POST)
                if comment_form.is_valid():
                    new_comment = comment_form.save(commit=False)
                    new_comment.article = article_obj
                    new_comment.save()
                    return redirect(article_obj.get_absolute_url())
                else:
                    comment_form = CommentForm()
        except Article.DoesNotExist:
            raise Http404
        except Article.MultipleObjectsReturned:
            article_obj = Article.objects.filter(slug=slug).first()
        except:
            raise Http404
    context = {
        "object": article_obj,
        'comments': comments,
        'new_comment': new_comment,
        'comment_form': comment_form
    }
    return render(request, "articles/detail.html", context=context)

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

пока что вы можете сначала передать primary_key и slug, как это делает stackoverflow с этими ссылками. это поможет вам быть уверенным, что метод .get() даст вам один элемент. и я использую get_object_or_404, чтобы избежать try and except.

    from django.shortcuts import get_object_or_404
    def article_detail_view(request,pk,slug=None):
        article_obj = None
        new_comment = None
        comments = None
        comment_form = None
        if slug is not None:

            article_obj = get_object_or_404(Article,pk=pk,slug=slug)
            comments = article_obj.comments.filter(active=True)
            if request.method == 'POST':
                comment_form = CommentForm(data=request.POST)
                if comment_form.is_valid():
                    new_comment = comment_form.save(commit=False)
                    new_comment.post = article_obj
                    new_comment.save()
                    return redirect(article_obj.get_absolute_url())
            else:
                comment_form = CommentForm()
        context = {
            'object': article_obj,
           'comments': comments,
           'new_comment': new_comment,
        'comment_form': comment_form
        }
        return render(request, "articles/detail.html", context=context)

измените свои урлы:

app_name = 'articles'
urlpatterns = [
    path('', article_search_view, name='search'),
    path('create/', article_create_view, name='create'),
    path('<int:pk>/<slug:slug>/', article_detail_view, name='detail'),
]
Вернуться на верх