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:
- 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})
- I have written the following in my
urls.pyandviews.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.serveUsing 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.