Когда использовать метод Django get_absolute_url()?

Документация Django гласит:

get_absolute_url() чтобы сообщить Django, как рассчитать канонический URL для объекта.

Что значит канонический URL в этом контексте?

Я знаю с точки зрения SEO, что канонический URL означает выбор лучшего URL из похожих URL (example.com, example.com/index.html). Но это значение не вписывается в этот контекст.

Я знаю, что этот метод обеспечивает некоторые дополнительные функции в администрировании Django, перенаправлении и т.д. И я полностью знаю, как использовать этот метод.

Но какая философия стоит за этим? Я никогда не использовал его в своих проектах. Это служит какой-то особой цели?

Ответ 1

Прежде всего, когда дело доходит до веб-разработки, вы действительно хотите избежать жестких путей кодирования в своих шаблонах. Причина этого в том, что пути могут измениться, и вам будет сложно пройти через все ваши HTML и шаблоны, чтобы найти каждый URL или путь и обновить его вручную. Это делает ваш код намного сложнее поддерживать.

Решением этого является определение функций, возвращающих URL-адрес. Здесь get_absolute_url() входит в изображение.

Пример:

<!-- Bad -->
<a href="/language/category/product/{{product.pk}}">Link</a>

<!-- Good -->
<a href="{{product.get_absolute_url}}">Link</a>

Канонический URL

Ваш второй вопрос - это канонический URL. Канонический URL - это "официальный" URL-адрес определенной страницы. Иногда актив может отображаться в нескольких URL-адресах, например:

/en/shoes/1-nike-shoes/
/en/shoes/1-nike-shoes?sort=price&order=asc
/en/shoes/1-nike-shoes?sort=price&order=desc

Здесь мы имеем тот же актив, отображаемый в 3 разных URL. "Канонический URL" будет тем, который мы определили как основной. Например. /en/shoes/1-nike-shoes/.

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

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

Ответ 2

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

Здесь get_absolute_url входит в картину. Он сообщает Django, куда идти, когда создается новый пост.

Ответ 3

get_absolute_url позволяет сохранить ваш объект DRY. Чтобы иметь URL-адрес, который определяет этот экземпляр объекта. В большинстве случаев это подробная страница для этого объекта.

Совместите это с models.permalink, и вы можете легко определить URL-адрес детали объекта.

Что такое @permalink и get_absolute_url в Django?

Позже, если вы измените структуру URL-адреса, вам нужно изменить только в одном месте, URL-адреса.

Ответ 4

Смотрите этот пример:

Я хочу сгенерировать уникальный URL для каждого продукта, шаблон будет - http://...../products/abcdefg/ (после '/products/' это мое значение slug).

В models.py я создал 'get_absolute_url', который будет генерировать URL в приведенном выше шаблоне

models.py

class Products(models.Model):
    title = models.CharField(max_length=120)
    slug = models.SlugField(blank=True, unique=True)
    description = models.TextField()

    def get_absolute_url(self):
        return f"/products/{self.slug}/"

productlist.html - get_absolute_url называют в якорной теге

{% for obj in object_list  %}
   <a href="{{obj.get_absolute_url}} ">{{obj.title}}</a> <br>
{% endfor %}

urls.py - мой шаблон URL

 path('/products/<slug>/', ProductDetails.as_view()),