Guest User

Untitled

a guest
Jul 22nd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.32 KB | None | 0 0
  1. from django.template.defaultfilters import slugify
  2. class AutoSlugMixin(object):
  3. """
  4. Automatically set slug to slugified version of the name if left empty.
  5. Use this as follows::
  6.  
  7. class MyModel(AutoSlugMixin, models.Model):
  8. def save(self):
  9. super(MyModel, self).save()
  10.  
  11. self.update_slug()
  12.  
  13. The name of the slug field and the field to populate from can be set
  14. using the `_slug_from` and `_slug_field` properties.
  15.  
  16. The big advantage of this method of setting slugs over others
  17. (ie. django-autoslug) is that we can set the value of slugs
  18. automatically based on the value of a field of an a field with a foreign
  19. key relation. For example::
  20.  
  21. class MyModel(AutoSlugMixin, models.Model):
  22. slug = models.SlugField()
  23.  
  24. def generate_slug(self):
  25. qs = self.mymodeltranslation_set.all()[:1]
  26. if qs.exists():
  27. return qs[0].name
  28. else:
  29. return ''
  30.  
  31. class MyModelTranslation(models.Model):
  32. parent = models.ForeignKey(MyModel)
  33. name = models.CharField()
  34.  
  35. def save(self):
  36. super(MyModel, self).save()
  37.  
  38. self.parent.update_slug()
  39.  
  40. (The code above is untested and _might_ be buggy.)
  41.  
  42. """
  43. _slug_from = 'name'
  44. _slug_field = 'slug'
  45.  
  46. def slugify(self, name):
  47. return slugify(name)
  48.  
  49. def generate_slug(self):
  50. name = getattr(self, self._slug_from)
  51. return self.slugify(name)
  52.  
  53. def update_slug(self, commit=True):
  54. if not getattr(self, self._slug_field) and \
  55. getattr(self, self._slug_from):
  56. setattr(self, self._slug_field, self.generate_slug())
  57.  
  58. if commit:
  59. self.save()
  60.  
  61.  
  62. class AutoUniqueSlugMixin(AutoSlugMixin):
  63. """ Make sure that the generated slug is unique. """
  64.  
  65. def is_unique_slug(self, slug):
  66. qs = self.__class__.objects.filter(**{self._slug_field: slug})
  67. return not qs.exists()
  68.  
  69. def generate_slug(self):
  70. original_slug = super(AutoUniqueSlugMixin, self).generate_slug()
  71. slug = original_slug
  72.  
  73. iteration = 1
  74. while not self.is_unique_slug(slug):
  75. slug = "%s-%d" % (original_slug, iteration)
  76. iteration += 1
  77.  
  78. return slug
Add Comment
Please, Sign In to add comment