Search code examples
djangoseodjango-urlsurlslug

Creating more SEO friendly urls in Django


I have a slug field for my Article model:

class Article(models.Model):
    Title = models.CharField(max_length=100, blank=False, null=False)
    Hero_image = models.ImageField(upload_to='hero-images/', blank= False, null=False)
    Image_caption = models.CharField(max_length=50, blank=False, null=False, default=" ")
    Content = tinymce_models.HTMLField(null=False, blank=False)
    Category = models.ManyToManyField(ArticleCategory,blank=False,related_name="articles")
    Published_date = models.DateTimeField(auto_now_add=True)
    Last_modified = models.DateField(auto_now=True)
    slug = models.SlugField(null=False, unique=True)

    def get_absolute_url(self):
        return reverse('blog-details', kwargs={"slug": self.slug})

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.Title)
        return super().save(*args, **kwargs)

And here is the blog-details view:

def blog_details(request, slug):
    Articles = Article.objects.get(slug=slug)

    context = {
        "Articles": Articles,
        }
    return render(request, "blog-details.html", context)

The URL path for the blog-details is :

path('(?P<slug>[-a-zA-Z0-9_]+)/', views.blog_details, name='blog-details'),

which gives me URLs like : http://127.0.0.1:8000/blogs/(%3FPkonstantin-the-guy-who-whatevers%5B-a-zA-Z0-9_%5D+)/ I wonder if this URL format is SEO friendly, and can I make it more human-readable .i.e: http://127.0.0.1:8000/blogs/konstantin-the-guy-who-whatevers/


Solution

  • You have left in your regular expressions when you just want to use the slug

    path('(?P<slug>[-a-zA-Z0-9_]+)/', views.blog_details, name='blog-details'),
    

    can simply be

    path('<slug:slug>/', views.blog_details, name='blog-details'),
    

    see the docs for more