SHOW:
|
|
- or go back to the newest paste.
| 1 | class City(models.Model): | |
| 2 | name = models.CharField(max_length=200, unique=True, verbose_name='Название') | |
| 3 | slug = models.SlugField(max_length=220, verbose_name='Slug', blank=True) | |
| 4 | ||
| 5 | def __str__(self): | |
| 6 | return self.name | |
| 7 | ||
| 8 | def make_slug(self, instance_before): | |
| 9 | if not instance_before: | |
| 10 | - | self.slug = create_slug(self.name) |
| 10 | + | self.slug = unique_slug(City, create_slug(self.name), instance=self) |
| 11 | ||
| 12 | def save(self, *args, **kwargs): | |
| 13 | instance_before = City.objects.get(pk=self.pk) if self.id else None | |
| 14 | ||
| 15 | self.make_slug(instance_before) | |
| 16 | ||
| 17 | super().save(*args, **kwargs) | |
| 18 | ||
| 19 | def create_slug(val): | |
| 20 | return slugify(unidecode(val)) | |
| 21 | ||
| 22 | ||
| 23 | def unique_slug(model, slug, instance=None): | |
| 24 | orig = slug | |
| 25 | for x in itertools.count(1): | |
| 26 | if instance: | |
| 27 | if not model.objects.filter(slug=slug).exclude(pk=instance.pk).exists(): | |
| 28 | break | |
| 29 | else: | |
| 30 | if not model.objects.filter(slug=slug).exists(): | |
| 31 | break | |
| 32 | slug = '%s-%d' % (orig, x) | |
| 33 | return slug |