Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the use of SlugField in django?

Note: Please dont consider it as duplicate post, all the existing posts are not giving clear understanding of SlugField.

My question is "we can sluggify and store the value in a CharField right? then why do we need SlugField for something that can be done easily using CharField?"

For example, in my model, I have a field called

url = models.CharField(max_length=30)
def save(self, ...):
    self.url = slugify(self.url)
    .......

Won't the url be saved in slugified format in database? I can use this slugified value in browser right, then what is the use of creating models.SlugFIeld(max_length=30)? What advantage SlugField will add over slugified CharField?

In above code, how replacing "CharField" with "SlugField" be advantageous?

like image 436
Kalyan Kumar Avatar asked Sep 19 '25 17:09

Kalyan Kumar


1 Answers

We can slugify and store the value in a CharField right? then why do we need SlugField for something that can be done easily using CharField?

A SlugField is a CharField, but a special CharField. It is a field that contains a validator that will, if you for example enter data through a form, validate if the entered string is indeed a slug. For example a slug does not contain whitespace, so if you would use the SlugField in a form, such that an author can specify the slug themselve, it will reject such slugs.

By default it uses the django.core.validators.validate_slug validator [GitHub]. The SlugField has an extra parameter allow_unicode. If this is set to True, it will use the django.core.validators.validate_unicode_slug validator [GitHub].

So in essence it is indeed a CharField, but with a validator that is determined by the **allow_unicode=… parameter [Django-doc]. This thus makes it more convenient.

Often you do not want to slugify the content of the slug field itself, but from another field, for example the title of a blog post entry. You thus still want to preserve the title, but make a slugified variant.

The django-autoslug package [readthedocs] provides an AutoSlugField [readthedocs] which is more convenient, since you can define how to populate the field, and thus it will automatically slugify:

from autoslug import AutoSlugField

class MyModel(models.Model):
    title = models.CharField(max_length=128)
    slug = AutoSlugField(populate_from='title')
like image 91
Willem Van Onsem Avatar answered Sep 22 '25 11:09

Willem Van Onsem