При сохранении комментария под статьей возвращается 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'),
]