Auto slug field

 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
from django.db.models import fields
from django.template.defaultfilters import slugify

def unique_slug(model, slug_field, slug_value):
    orig_slug = slug = slugify(slug_value)
    
    index = 0
    
    while True:
        try:
            model.objects.get(**{slug_field: slug})
            index += 1
            slug = orig_slug + '-' + str(index)
        except model.DoesNotExist:
            return slug

class AutoSlugField(fields.SlugField):
    def pre_save(self, model_instance, add):
        if self.prepopulate_from:
            if self.unique:
                return unique_slug(model_instance.__class__, self.name, getattr(model_instance, self.prepopulate_from[0]))
            else:
                return slugify(getattr(model_instance, self.prepopulate_from[0]))
        else:
            return super(AutoSlugField, self).pre_save(model_instance, add)

Comments

kujemanee (on April 28, 2008):

slug = models.SlugField(unique=True,prepopulate_from=('title',))

not enough ?

#

jefurii (on April 28, 2008):

This would make it easier to do automated testing. Slug fields have always errored out for me, and this snippet looks like it would address that.

#

GaretJax (on May 4, 2008):

@kujemanee Using a simple SlugField the values is prepopulated only in the admin interface trough javascript. Using AutoSlugField the value is automatically retrieved by each saving if necessary and adapted to be unique

#

(Forgotten your password?)

You may use Markdown syntax here, but raw HTML will be removed.