Getting 404 error when trying to use slugs in Django

43 Views Asked by At

I am using Django to develop a website, and need use slugs in URLs. When I use ids, everything works well.

I have done the following steps:

  1. I have a model 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. I have written the following in my urls.py and views.py

App urls.py:

path('fitness/<slug:post_slug>/', views.show_post, name='post'),

Project urls.py:

from django.contrib import admin 
from django.urls import path 
from immuno2you import views 
from django.conf import settings 
from django.conf.urls.static import static 

urlpatterns = [ 

    path('admin/', admin.site.urls),
    path('', views.index, name='index'),
    path('healthy-nutrition/', views.nutrition, name='nutrition'), 
    path('fitness/', views.fitness, name='fitness'), 
    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})

and this works well.

However, when I try to make some amendments to use these slugs:

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})

I get the following error:

Page not found (404)

“/home/tkzeujpw/blog/fitness/fitness-post-1” does not exist

Request Method: GET
Request URL: http://example.com/fitness/fitness-post-1
Raised by: django.views.static.serve

Using the URLconf defined in example.urls, Django tried these URL patterns, in >this order:

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

The current path, fitness/fitness-post-1, matched the last one.

You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

The only thing that I changed was the self.pk parameter to self.slug.

0

There are 0 best solutions below