У меня есть блог, который работал без ошибок. Разные пользователи могут регистрироваться, входить в систему и публиковать статьи. Пользователи могут писать / редактировать / удалять комментарии к статьям. Ранее URL-адрес статей определялся с использованием «идентификатора статьи». Позже я прочитал этот учебник и добавил заголовок вместе с идентификатором в URL-адрес для каждой статьи в подробном представлении. Затем я удалил свои старые статьи, так как в них не было слагов.
После этого изменения пользователь может успешно создать комментарий, но не может «редактировать» или «удалять» какой-либо комментарий. Каждый раз, когда нажимается кнопка «редактировать» или «удалить», отображается ошибка 404. См. Изображение ошибки, нажав эту ссылку .
Страница не найдена (404)
Метод запроса: GET
URL-адрес запроса: http://localhost: 8000 / article / 33 / comment_edit /
Создано: article.views.ArticleDetailView
Не найдено статей, соответствующих запросу
Мои соответствующие файлы перечислены ниже:
urls.py (внутри каталога приложения «Статьи»)
from django.urls import path
from .views import (ArticleListView, ArticleUpdateView, ArticleDetailView, ArticleDeleteView, ArticleCreateView,
CommentCreateView, CommentUpdateView, CommentDeleteView)
urlpatterns = [
path('', ArticleListView.as_view(), name='article_list'),
path('<int:pk>/<str:slug>/edit/', ArticleUpdateView.as_view(), name='article_edit'),
path('<int:pk>/<str:slug>/', ArticleDetailView.as_view(), name='article_detail'),
path('<int:pk>/<str:slug>/delete/', ArticleDeleteView.as_view(), name='article_delete'),
path('new/', ArticleCreateView.as_view(), name='article_new'),
#Comments below
path('<int:pk>/<str:slug>/comment/', CommentCreateView.as_view(), name='comment_new'),
path('<int:pk>/comment_edit/', CommentUpdateView.as_view(), name='comment_edit'),
path('<int:pk>/comment_delete/', CommentDeleteView.as_view(), name='comment_delete'),
]
Я попытался запустить веб-сайт, закомментировав URL для комментариев, т. е. последние три строки выше. Показанная ошибка такая же. Это странно.
urls.py (внутри каталога проекта)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('users/', include('django.contrib.auth.urls')),
path('', include('pages.urls')),
path('articles/', include('articles.urls')),
]
views.py (внутри каталога приложения Articles)
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, DeleteView, CreateView
from django.urls import reverse_lazy
from .models import Article, Comment
# Create your views here.
class ArticleListView(ListView):
model = Article
template_name = 'article_list.html'
ordering = ['-date']
class ArticleDetailView(DetailView):
model = Article
template_name = 'article_detail.html'
query_pk_and_slug = True
class ArticleUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):
model = Article
fields = ('title', 'body',)
template_name = 'article_edit.html'
login_url = 'login'
#def test_func for UserPassesTestMixin
def test_func(self):
obj = self.get_object()
return obj.author == self.request.user
success_message = 'Article was updated successfully!'
class ArticleDeleteView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, DeleteView):
model = Article
template_name = 'article_delete.html'
success_url = reverse_lazy('article_list')
login_url = 'login'
def test_func(self):
obj = self.get_object()
return obj.author == self.request.user
success_message = 'Article was deleted successfully!'
class ArticleCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
model = Article
fields = ('title', 'body')
template_name = 'article_new.html'
login_url = 'login' #for LoginRequiredMixin, overriding default login url at accounts/login
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
success_message = 'Article was created successfully!'
#Now for the feature of adding comments on listview and detailview of articles
class CommentCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
model = Comment
fields = ('comment',)
template_name = 'comment_new.html'
login_url = 'login'
query_pk_and_slug = True
def form_valid(self, form):
form.instance.author = self.request.user
form.instance.article = Article.objects.get(pk=self.kwargs['pk'])
return super().form_valid(form)
success_message = 'Comment was posted successfully!'
class CommentUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):
model = Comment
fields = ('comment',)
template_name = 'comment_edit.html'
login_url = 'login'
#def test_func for UserPassesTestMixin
def test_func(self):
obj = self.get_object()
return obj.author == self.request.user
success_message = 'Comment was updated successfully!'
class CommentDeleteView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, DeleteView):
model = Comment
template_name = 'comment_delete.html'
success_url = reverse_lazy('article_list')
login_url = 'login'
def test_func(self):
obj = self.get_object()
return obj.author == self.request.user
success_message = 'Comment was deleted successfully!'
models.py (внутри каталога приложения «Статьи»)
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
from django.urls import reverse
from django.utils.text import slugify
User = get_user_model()
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(
default='',
editable=False,
max_length=255,
)
body = models.TextField()
date = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
)
def __str__(self):
return self.title
def get_absolute_url(self):
kwargs = {
'pk': self.id,
'slug': self.slug
}
return reverse("article_detail", kwargs=kwargs)
def save(self, *args, **kwargs):
value = self.title
self.slug = slugify(value, allow_unicode=True)
super().save(*args, **kwargs)
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments')
comment = models.TextField()
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
)
def __str__(self):
return self.comment
def get_absolute_url(self):
kwargs = {
'pk': self.article.id,
'slug': self.article.slug
}
return reverse("article_detail", kwargs=kwargs)
Ссылки для создания комментария, редактирования комментария и удаления комментария в любом html файл выглядит так:
<a href="{% url 'comment_new' article.pk article.slug %}">Add Comment</a>
<a href="{% url 'comment_edit' comment.pk %}">Edit Comment</a>
<a href="{% url 'comment_delete' comment.pk %}">Delete Comment</a>
В моем settings.py файле ALLOWED_HOSTS = ['*']
.
Пожалуйста, помогите мне с этой проблемой . Я искал в Интернете, но не нашел решения.