How to create a unique slug in Django

后端 未结 12 501
栀梦
栀梦 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:50

    just try to slug a unique values together , for example : i am going to slugfy time,username,ticket_subject together and save it as a slug, like the following :

    from django.utils.text import slugify 
    from datetime import datetime
    
    
    time_now = datetime.now().strftime('%Y-%m-%d_%H:%M:%S')
    class ticket(models.Model):
        TKT_USER = models.ForeignKey(User, related_name='TKT_USER', on_delete=models.CASCADE)
        TKT_SUB = models.CharField(max_length=20, db_index=True, verbose_name="ticket subject")
        TKT_BOD = models.TextField(verbose_name="ticket body")
        TKT_SLug = models.SlugField(blank=True, null=True, db_index=True, unique=True)
    
    
    
        def save(self , *args , **kwargs):
             if not self.TKT_SLug:
                data_to_slug = f"{time_now}_{self.TKT_USER}_{self.TKT_SUB}"
                self.TKT_SLug = slugify(data_to_slug)
                super(ticket , self).save(*args, **kwargs)
    
    0 讨论(0)
  • 2020-12-04 22:53
    class Need(models.Model):
        title = models.CharField(max_length=50)
        us_zip = models.CharField(max_length=5)
        slug = models.SlugField(unique=True)
    
        def save(self, **kwargs):
            slug_str = "%s %s" % (self.title, self.us_zip) 
            super(Need, self).save()
    
    0 讨论(0)
  • 2020-12-04 22:55

    Hi can you tried this function

    class Training(models.Model):
        title = models.CharField(max_length=250)
        text = models.TextField()
        created_date = models.DateTimeField(
        auto_now_add=True, editable=False, )
        slug = models.SlugField(unique=True, editable=False, max_length=250)
    
        def __unicode__(self):
           return self.title
    
        def save(self, *args, **kwargs):
           self.slug =get_unique_slug(self.id,self.title,Training.objects)
           return super(Training, self).save(*args, **kwargs)
    
    def get_unique_slug(id,title,obj):
        slug = slugify(title.replace('ı', 'i'))
        unique_slug = slug
        counter = 1
        while obj.filter(slug=unique_slug).exists():
           if(obj.filter(slug=unique_slug).values('id')[0]['id']==id):
               break
           unique_slug = '{}-{}'.format(slug, counter)
           counter += 1
        return unique_slug
    
    0 讨论(0)
  • 2020-12-04 22:57

    I use this snippet for generating unique slug and my typical save method look like below

    slug will be Django SlugField with blank=True but enforce slug in save method.

    typical save method for Need model might look below

    def save(self, **kwargs):
        slug_str = "%s %s" % (self.title, self.us_zip) 
        unique_slugify(self, slug_str) 
        super(Need, self).save(**kwargs)
    

    and this will generate slug like buy-a-new-bike_Boston-MA-02111 , buy-a-new-bike_Boston-MA-02111-1 and so on. Output might be little different but you can always go through snippet and customize to your needs.

    0 讨论(0)
  • 2020-12-04 22:58

    Django provides a SlugField model field to make this easier for you. Here's an example of it in a "blog" app's

    class Post(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField(blank=True)
    
        slug = models.SlugField(unique=True)
    
        @models.permalink
        def get_absolute_url(self):
            return 'blog:post', (self.slug,)
    

    Note that we've set unique=True for our slug field — in this project we will be looking up posts by their slug, so we need to ensure they are unique. Here's what our application's views.py might look like to do this:

    from .models import Post
    
    def post(request, slug):
        post = get_object_or_404(Post, slug=slug)
    
        return render(request, 'blog/post.html', {
            'post': post,
        })
    
    0 讨论(0)
  • 2020-12-04 23:00

    My little code:

    def save(self, *args, **kwargs):
        strtime = "".join(str(time()).split("."))
        string = "%s-%s" % (strtime[7:], self.title)
        self.slug = slugify(string)
        super(Need, self).save()
    
    0 讨论(0)
提交回复
热议问题