Post Detail
Post #207
EN
Post Slugs Update (we've been there, haven't we ?)
Post slugs have been updated
What’s new ?
- Nothing
What changed ?
-
- Post slugs changed
- Slugs are based off the title, which means if the title is “This post will talk about Banana Split”, the post slug will be “this-post-will-talk-about-banana-split”.
- There’s a big problem with that, if two titles are the same (which I want it to be possible, for different reasons but also because I don’t have much more ideas on how to name the Wednesday Posts), the two slugs will bug because they’ll be the same, and slugs HAVE to be different (for a few reasons, first: they kinda act like an ID (it’s the only other thing that can be used as an ID with Django), second: if two posts have the same slug… how would you go to one or the other ? well you couldn’t).
Good news !
the old code for auto generated slugs was:
1def save(self, *args, **kwargs):
2 if not self.slug:
3 self.slug = slugify(self.title)
4 return super().save(*args, **kwargs)
Basically if the slug doesn’t exist create one based on the title.
The code is now:
1def save(self, *args, **kwargs):
2 max_length = Post._meta.get_field('slug').max_length
3 self.slug = orig = slugify(self.title)[:max_length]
4 for x in itertools.count(2):
5 if self.pk:
6 if Post.objects.filter(Q(slug=self.slug),
7 Q(author=self.author),
8 Q(id=self.pk),
9 ).exists():
10 break
11 if not Post.objects.filter(slug=self.slug).exists():
12 break
13
14 # Truncate & Minus 1 for the hyphen.
15 self.slug = "%s-%d" % (orig[:max_length - len(str(x)) - 1], x)
16 return super().save(*args, **kwargs)
Meaning even more basically:
If the post doesn’t have a slug, create one, but if the slug you’re trying to exist already exists, add a number after it, starting with 2 (so if the slug “this-post-will-talk-about-banana-split” exists, create “this-post-will-talk-about-banana-split-2”), and voilà, we can have two times the same title but the auto slug will be different

No comments here yet.