Slugify self.title + случайные числа - PullRequest
0 голосов
/ 05 августа 2020

Надеюсь, ты в порядке. У меня к вам два вопроса:

 class Post(models.Model):
        title = models.CharField(max_length=200, unique=True)
        slug = models.SlugField(max_length=200, unique=True)
        url_image = models.URLField(max_length=200, default='SOME STRING')
        author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
        updated_on = models.DateTimeField(auto_now= True)
        name_site = models.CharField(max_length=200, default='NA')
        url_site = models.URLField(max_length=200, default='https://exemple.fr/')
        content = models.TextField()

I. Мне нужен мой титул (unique = False), потому что у меня есть похожие заголовки. Так можно ли сохранить мой slug (editable = False) с slugify с чем-то вроде этого:

 slug_str = "%s %s" % (self.title, 4 random numbers like that 0476)

Если у кого-то есть идея получше, меня интересует

Большое спасибо :) хороших праздников и береги

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Вот несколько функций, которые я использую. Вы передаете экземпляр модели и желаемый заголовок в unique_slugify, который будет продолжать попытки добавлять случайные строки, пока не будет создана одна, которая еще не существует.

import random
import string

def random_string_generator(size=10, chars=string.ascii_lowercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

def unique_slugify(instance, slug):
    model = instance.__class__
    unique_slug = slug
    while model.objects.filter(slug=unique_slug).exists():
        unique_slug = slug
        unique_slug += random_string_generator(size=4)
    return unique_slug

Я обычно использую его, переопределяя модель save метод.

class YourModel(models.Model):
    slug = models.SlugField(max_length=200, unique=True)
    title = models.CharField(max_length=200)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = unique_slugify(self, slugify(self.title))
        super().save(*args, **kwargs)
1 голос
/ 05 августа 2020

на мой взгляд, это не значит, что два сообщения могут иметь одинаковый заголовок даже с двумя разными слагами, это даже сбивает читателей с толку и, что еще хуже, очень плохо для SEO. Я предлагаю вам избежать этого пути и попробовать просмотреть logi c

в models.py

class Post(models.Model):
    title = models.CharField(_('title'), max_length=200,
        unique=True,  # title should be unique
        help_text=_('The title of the entry.')
    )

    slug = models.SlugField(_('slug'), max_length=200,
        unique=True, null=True, blank=True,  
        help_text=_(
            'If blank, the slug will be generated automatically '
            'from the given title.'
        )
    )

[..]

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)  # here you don't need to add random numbers since the title is already unque 
        super().save(*args, **kwargs)

в admin.py

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', .. )
    readonly_fields = ('slug', .. )  # Add slug to read_only fields to make it not editable if you want 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...