Получение 404 ошибки при попытке использовать slugs в Django
Я новичок в Django и пытаюсь разработать сайт. Мне нужно, чтобы в Django.
можно было использовать slugs в URL-адресах.Когда я использую идентификаторы, все работает хорошо.
Я выполнил следующие действия:
- У меня есть модель 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})
- Я написал следующее в своих 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