Начиная с вашего кода instance.title
всегда важно для генерации значения слага.Тогда одним из возможных способов без запуска сигнала pre_save является перезапись функции сохранения модели и присвоение ей значения.
def create_slug(title, new_slug=None):
slug = slugify(title, allow_unicode = True)
if new_slug is not None:
slug = new_slug
qs = Posts.objects.filter(slug=slug).order_by("-id")
exists = qs.exists()
if exists:
new_slug = "%s-%s"%(slug, qs.first().id)
return create_slug(title, new_slug=new_slug)
return slug
class Posts(models.Model):
title = models.CharField(max_length=60)
slug = models.SlugField(unique = True)
file_upload = models.FileField(null= True, blank=True, validators=[FileExtensionValidator(['pdf'])])
content = models.TextField()
category = models.ForeignKey(Category, null= True,verbose_name="Category", on_delete=models.CASCADE)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
# class Meta:
# verbose_name = "Post"
# verbose_name_plural = "Posts"
# ordering = ['-created_at']
def save(self, *args, **kwargs):
if not self.slug:
self.slug = create_slug(self.title)
return super(Posts, self).save(*args, **kwargs) # important to call this
def __unicode__(self):
return self.title
def __str__(self):
return self.title
Я действительно надеюсь, что это решение будет работать.Другой возможный способ использовать вызываемую по умолчанию функцию поля link , но из вашего кода я вижу, что title
также важно.Я не совсем уверен, но следующая вещь также может работать.
def create_slug(title, new_slug=None):
slug = slugify(title, allow_unicode = True)
if new_slug is not None:
slug = new_slug
qs = Posts.objects.filter(slug=slug).order_by("-id")
exists = qs.exists()
if exists:
new_slug = "%s-%s"%(slug, qs.first().id)
return create_slug(title, new_slug=new_slug)
return slug
class Posts(models.Model):
title = models.CharField(max_length=60)
slug = models.SlugField(unique = True, default=create_slug(self.title))
file_upload = models.FileField(null= True, blank=True, validators=[FileExtensionValidator(['pdf'])])
content = models.TextField()
category = models.ForeignKey(Category, null= True,verbose_name="Category", on_delete=models.CASCADE)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
# class Meta:
# verbose_name = "Post"
# verbose_name_plural = "Posts"
# ordering = ['-created_at']
def __unicode__(self):
return self.title
def __str__(self):
return self.title