Динамический слаг с постоянным перенаправлением или хранением слага в базе данных

Какой вариант лучше всего подходит для URL на странице новостей:

Динамически генерировать слизней. Загрузите страницу с идентификатором объекта. Если слаг не совпадает, перенаправьте перманент на правильный слаг.

myweb.com/542/my-news-item

Минусы, которые я вижу: если заголовок новости изменяется, слаг меняет, но старый слаг будет перенаправлен на новый, поэтому я не знаю, если это проблема для поиска.

ИЛИ ЖЕ:

Статический слаг, который никогда не изменится, даже если заголовок новости изменится.

myweb.com/my-news-item

Минусы я вижу: еще одно поле на БД. Если я радикально изменю заголовок новости, то слизняк будет совсем другим

2 ответа

Если вы хотите, чтобы слагы обновлялись, не нарушая старые URL, вы можете отделить слагов и связать последние в своих представлениях списка, что-то вроде этого должно сделать это:

class Article(models.Model):
    title = models.CharField() # etc

class ArticleSlug(models.Model):
    article = models.ForeignKey(Article)
    slug = models.SlugField(unique=True)
    date_created = models.DateTime(auto_now_add=True, editable=False)

    class Meta:
        get_latest_by = "date_created" 

В своем шаблоне привлечения можно просто вызвать последний слаг, но вы, вероятно, захотите иметь некоторую иерархию M/Y/D в URL-адресах.

<a href="/news/articles/{{ article.articleslug_set.latest }}/">{{ article.title }}</a>

Если ваш сайт получает большой трафик, вы можете добавить задачу сельдерея, которая извлекает последнюю порцию и копирует ее в поле модели вашей статьи время от времени. Это сэкономит вам несколько SQL-соединений.

Как насчет сочетания использования приложения перенаправления и сигнала сохранения после записи, подобного тому, что написал этот парень.

Другие вопросы по тегам