Динамический слаг с постоянным перенаправлением или хранением слага в базе данных
Какой вариант лучше всего подходит для 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-соединений.
Как насчет сочетания использования приложения перенаправления и сигнала сохранения после записи, подобного тому, что написал этот парень.