from django.utils.text import slugify class Post(models.Model): header = models.CharField(max_length=50) slug = models.SlugField(unique=True, db_index=True) def __str__(self): return self.header def get_absolute_url(self): return reverse("post-detail", kwargs={"slug": self.slug}) def unique_slug_generator(instance): constant_slug = slugify(instance.header) slug = constant_slug num = 0 Klass = instance.__class__ while Klass.objects.filter(slug=slug).exists(): num += 1 slug = "{slug}-{num}".format(slug=constant_slug, num=num) return slug def pre_save_reciever(sender, instance, *args, **kwargs): if not instance.slug or instance.header != Post.objects.filter(slug=instance.slug): instance.slug = unique_slug_generator(instance) pre_save.connect(pre_save_reciever, sender=Post)