How to create a unique slug in Django

后端 未结 12 527
栀梦
栀梦 2020-12-04 22:17

I am trying to create a unique slug in Django so that I can access a post via a url like this: http://www.example.com/buy-a-new-bike_Boston-MA-02111_2

The relevant m

12条回答
  •  無奈伤痛
    2020-12-04 22:41

    from django.utils.text import slugify Helps a lot and has quite clear Concepts. Here one example on How to auto-generate slug by using from django.utils.text import slugify

    utils.py

    from django.utils.text import slugify
    import random
    import string
    
    # Random string generator
    def random_string_generator(size=10, chars=string.ascii_lowercase + string.digits):
        return ''.join(random.choice(chars) for _ in range(size))
    
    # Unique Slug Generator 
    def unique_slug_generator(instance, new_slug=None):
        """
        It assumes your instance has a model with a slug field and a title character (char) field.
        """
        if new_slug is not None:
            slug = new_slug  
        else:
            slug = slugify(instance.title)  
    
        Klass = instance.__class__
    
        qs_exists = Klass.objects.filter(slug=slug).exists()
    
        if qs_exists:
            new_slug = "{slug}-{randstr}".format(slug=slug, randstr=random_string_generator(size=4))
            return unique_slug_generator(instance, new_slug=new_slug)
        return slug
    

    models.py

    from django.db.models.signals import pre_save # Signals
    # import the unique_slug_generator from .utils.py 
    from .utils import unique_slug_generator
    
    class Product(models.Model):
        title  = models.CharField(max_length=120)
        # set blank to True
        slug  = models.SlugField(blank=True, unique=True)
    
    def product_pre_save_receiver(sender, instance, *args, **kwargs):
        if not instance.slug:
            instance.slug = unique_slug_generator(instance)
    
    
    pre_save.connect(product_pre_save_receiver, sender=Product)
    

    Django documentation explains Django.utils.text import slugify to generate slug automatically. You can read more detail here

    After implementing the code, while creating product, you may leave the slug field blank, which will be further aquired with auto generated slug for the product which will be unique in this case.

提交回复
热议问题