Django URL-адреса и просмотры определены правильно, ошибка 404 по-прежнему отображается - PullRequest
0 голосов
/ 07 мая 2020

У меня есть блог, который работал без ошибок. Разные пользователи могут регистрироваться, входить в систему и публиковать статьи. Пользователи могут писать / редактировать / удалять комментарии к статьям. Ранее 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 = ['*'].

Пожалуйста, помогите мне с этой проблемой . Я искал в Интернете, но не нашел решения.

Ответы [ 2 ]

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

Важная часть сообщения об ошибке:

Raised by: articles.views.ArticleDetailView

Вы пытаетесь отредактировать комментарий на /articles/33/comment_edit/, но он соответствует шаблону URL:

path('<int:pk>/<str:slug>/', ArticleDetailView.as_view(), name='article_detail'),

Это дает 404, потому что у вас нет статьи с pk = 33 и slug = 'comment_edit'.

Вы можете исправить проблему, переместив CommentUpdateView выше ArticleDetailView так, чтобы оно соответствовало первым.

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

Вы добавили имя своего приложения в settings.py? Убедитесь, что вы добавили имя в settings.py, который находится в папке проекта.

Примерно так,

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_name',] # <--- WhatEver is called 

А также убедитесь, что вы используете свои маршруты, которые вы определили для доступа правильная страница

...