# Add the slug field inside Django Model

djangoObject Oriented ProgrammingProgramming

#### Build Python Django Real Project: Django Web Development

Best Seller

79 Lectures 10 hours

#### Build Car Dealer website in Django 3

25 Lectures 3.5 hours

#### From IDEA to Product Using Python / Django

Most Popular

47 Lectures 16.5 hours

In this tutorial, we are going to learn about the SlugField in Django.

## SlugField

SlugField is a way to generate a URL using the data which we already have. You can generate URL using your title of the post or page. Let's see one detailed example.

Let's say we have an article with name This is from Tutorialspoint with id = 5. Then we can have URL as www.tutorialspoint.com/posts/5/. It's difficult for the content writers to recognize the article with the previous URL. But, if you have a URL like www.tutorialspoint.com/this-isfrom-tutorialspoint, then it's easy for us to identify the piece. So, SlugField is used to generate those types of URLs'.

Let's see the code of our post model. Compare your model with the following model.

CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
class Article(models.Model):
title = models.CharField(max_length = 250)
slug = models.SlugField(max_length = 250, null = True, blank = True)
text = models.TextField()
updated_time = models.DateTimeField(auto_now = True)
status = models.CharField(max_length = 10, choices = CHOICES, default ='draft')
class Meta:
ordering = ('_Published_At', )
def __str__(self):
return self.title

Now, we will add SlugField to our project. So, it automatically generates the URLs according the title.

Create a file called util.py in the project level directory. We have to generate URL every time invoke the Post model. To achieve that, we need signals.

import string
from django.utils.text import slugify
def get_random_string(size = 10, chars = string.ascii_lowercase + string.digits
return ''.join(random.choice(chars) for _ in range(size))
def get_slug(instance, slug = None):
if slug is not None:
slug_two = slug
else:
slug_two = slugify(instance.title)
Klass = instance.__class__
is_exists = Klass.objects.filter(slug_two = slug_two).exists()
if is_exists:
slug_two = "{slug_two}-{random_string}".format(slug_two = slug_two, ran
string = get_random_string(size = 5))
return get_slug(instance, slug = slug)
return slug_two

Add the following code at the end of the file models.py.

def pre_save_receiver(sender, instance, *args, **kwargs):
if not instance.slug_two:
instance.slug_two = get_slug(instance)
pre_save.connect(pre_save_receiver, sender = Article)

In the urls.py edit the path like path('posts/', post). Edit the views.py according to the code.

def article(request, slug):
obj = Article.objects.filter(slug__iexact = slug)
if obj.exists():
obj = obj.first()
else:
return render(request, 'posts/post.html', context)