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 |