rahnama7m
rahnama7m

Reputation: 977

Problem with uncontrolled modify every time data is saved in django slug

I want to create unique slug.I want to create unique slug. I use some methods to generate unique slug,but I have problem with them.

this is my model and my method to create unique slug:

#Models.py
class MyModel(models.Model):

    slug = models.SlugField(null=True, blank=True, unique=True)

    def _get_unique_slug(self, slug_input):
        slug = slugify(slug_input)
        unique_slug = slug
        num = 1
        while Curriculum.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, num)
            num += 1
        return unique_slug

    def save(self, *args, **kwargs):
        if not self.id:  # Create
            if not self.slug:  # slug is blank
                self.slug = self._get_unique_slug(slug_input=self.title)
            else:  # slug is not blank
                self.slug = self._get_unique_slug(slug_input=self.slug)
        else:  # Update
            self.slug = self._get_unique_slug(slug_input=self.slug)
        super(Curriculum, self).save(*args, **kwargs)

This method have two problem:

1. Every time that I save each object(even without modify it), slug changes and '-1' append to it.

2. For some language such as Arabic and Farsi(Persian) slug didn't create. how can I fix these problems?

Upvotes: 0

Views: 145

Answers (1)

katoozi
katoozi

Reputation: 398

slug field have allow_unicode:

slug = models.SlugField(null=True, blank=True, unique=True, allow_unicode=True, max_length=255)

prepopulate slug in ModelAdmin:

    #admin.py 
    class EditModel(admin.ModelAdmin):
              prepopulated_fields = {'slug': ('title',)}
    admin.site.register(ModelName, EditModel)

customize slug field data:

from django.utils.text import slugify

# overwrite your model save method || necessary for : django<1.11.12
def save(self, *args, **kwargs):
    title = self.title
    # allow_unicode=True for support utf-8 languages
    self.slug = slugify(title, allow_unicode=True)
    super(ModelName, self).save(*args, **kwargs)

Upvotes: 1

Related Questions