Получение 404 ошибки при попытке использовать slugs в Django

Я новичок в Django и пытаюсь разработать сайт. Мне нужно, чтобы в Django.

можно было использовать slugs в URL-адресах.

Когда я использую идентификаторы, все работает хорошо.

Я выполнил следующие действия:

  1. У меня есть модель Posts с .
class Post(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True, default='')  
    content = models.TextField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True) 
    photo = models.ImageField(upload_to='post_photos/', blank=True)  # ImageField для хранения изображений
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_published = models.BooleanField(default=False)  

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.photo:  # Если поле photo пустое, генерируем случайный путь к изображению
            random_image_path = get_random_image_path()
            self.photo = random_image_path  # Привязываем случайное изображение к объекту Post
        super().save(*args, **kwargs)
        

    def get_absolute_url(self):
        return reverse('post', kwargs={'post_slug': self.slug})
  1. Я написал следующее в своих urls.py и views.py
path('fitness/<slug:post_slug>/', views.show_post, name='post'),
def show_post(request, post_slug):
    post = get_object_or_404(Post, slug=post_slug)
    return render(request, 'show_post.html', {'post': post})

и это хорошо работает.

Но затем я пытаюсь внести некоторые поправки, чтобы использовать пули. Следующие:

def get_absolute_url(self):
        return reverse('post', kwargs={'post_slug': self.slug})

def show_post(request, post_slug):

post = get_object_or_404(Post, slug=post_slug, category__slug='fitness')

return render(request, 'show_post.html', {'post': post})

И я получаю следующую ошибку

Страница не найдена (404)

"/home/tkzeujpw/blog/fitness/fitness-post-1" не существует

Метод запроса: GET URL запроса: http://example.com/fitness/fitness-post-1. Вызвано: django.views.static.serve

Используя URLconf, определенный в example.urls, Django попробовал эти шаблоны URL, в таком порядке:

admin/
[name='index']
healthy-nutrition/ [name='nutrition']
fitness/ [name='fitness']
fitness/<slug:post_slug>/ [name='post']
^(?P<path>.*)$

Текущий путь, fitness/fitness-post-1, совпал с последним.

Вы видите эту ошибку, потому что в файле настроек Django у вас стоит DEBUG = True. Измените это значение на False, и Django отобразит стандартную страницу 404.

Но я меняю только один параметр self.pk на self.slug. Пожалуйста, помогите мне решить эту проблему.

Очень признателен.

Я искал в интернете решение этой проблемы. Но, как я вижу, код правильный (возможно).

Страница не найдена (404)

"/home/tkzeujpw/blog/fitness/fitness-post-1" не существует

Метод запроса: GET URL запроса: http://example.com/fitness/fitness-post-1

Вы делаете запросы к конечной точке без косой черты /.

fitness/fitness-post-1 не то же самое, что fitness/fitness-post-1/

В django по умолчанию

если URL-адрес запроса не соответствует ни одному из шаблонов в URLconf и не заканчивается на слэш, выдается HTTP-перенаправление на тот же URL с добавлением слэша.

Но в вашем случае вы отлавливаете все несоответствующие url-запросы:

^(?P.*)$

Текущий путь, fitness/fitness-post-1, совпал с предыдущим.

В результате это не позволит django сделать HTTP-перенаправление с добавлением слэша.

Либо уберите ^(?P.*)$ из настроек URLconf, либо убедитесь, что запросы всегда выполняются с добавлением слэша.

А также:

По умолчанию APPEND_SLASH установлен на True, на всякий случай убедитесь, что он НЕ установлен на False

Вернуться на верх