Когда использовать метод 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()),