- May 17, 2008
- slug save
- 2 (after 2 ratings)
This takes the "easier to ask forgiveness than permission" approach to making sure your model's slug is unique.
If the model's slug is empty, make a slug from the model's 'name' field.
We assume that it is a conflicting slug that is throwing the IntegrityError, in which case if the slug does not end with '-' followed by a number then append '-2'. If the slug does end with '-' followed by a number then capture that final number, increment it by one, save the new slug value and try savin g again.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
from django.db import models, IntegrityError class MyModel(models.Model): def save(self): """Auto-populate an empty slug field from the MyModel name and if it conflicts with an existing slug then append a number and try saving again. """ import re from django.template.defaultfilters import slugify if not self.slug: self.slug = slugify(self.name) # Where self.name is the field used for 'pre-populate from' while True: try: super(MyModel, self).save() # Assuming the IntegrityError is due to a slug fight except IntegrityError: match_obj = re.match(r'^(.*)-(\d+)$', self.slug) if match_obj: next_int = int(match_obj.group(2)) + 1 self.slug = match_obj.group(1) + '-' + str(next_int) else: self.slug += '-2' else: break
More like this
- Hierarchical page slugs by baumer1122 7 years, 6 months ago
- YAAS (Yet Another Auto Slug) by carljm 6 years, 9 months ago
- Unique Slugify by SmileyChris 6 years, 10 months ago
- Self-referencing Foreign Key Infinite Loop by minarets 7 years, 5 months ago
- Automate unique slugs by taojian 7 years, 2 months ago