Использование канонических URL-адресов для моделей
На веб-сайте могут быть разные страницы, отображающие один и тот же контент. В нашем приложении изначальная часть контента по каждому посту отображается как на странице списка постов, так и на странице детальной информации о посте.
Канонический URL-адрес – это предпочтительный URL-адрес ресурса. Его можно представить как URL-адрес наиболее репрезентативной страницы с конкретным контентом.
На сайте могут быть разные страницы, которые показывают посты, но есть один URL-адрес, который используется в качестве главного URL-адреса поста.
Канонические URL-адреса позволяют указывать URL-адрес мастер-копии страницы. Django дает возможность в своих собственных моделях реализовывать метод get_absolute_url(), который возвращает канонический URL-адрес объекта.
Мы будем использовать URL-адрес post_detail, определенный в шаблонах URL-адресов приложения, чтобы формировать канонический URL-адрес для объектов Post.
Django предоставляет различные функции-резольверы URL, которые позволяют формировать URL-адреса динамически, используя их имя и любые требуемые параметры.
Мы будем использовать функцию утилиту reverse() модуля django.urls.
Отредактируйте файл models.py приложения blog, импортировав функцию reverse() и добавив метод get_absolute_url() в класс Post, как показано ниже:
from django.urls import reverse
class Post(models.Model):
............
def get_absolute_url(self):
return reverse('blog:post_detail',
args=[self.id])
Функция reverse() будет формировать URL-адрес динамически, применяя имя URL-адреса, определенное в шаблонах URL-адресов.
Мы использовали именное пространство blog, за которым следуют двоеточие и URL-адрес post_detail.
Напомним, что именное пространство blog определяется в главном файле urls.py проекта при вставке шаблонов URL-адресов из blog.urls.
URL-адрес post_detail определен в файле urls.py приложения blog. Результирующий строковый литерал, blog:post_detail, можно использовать глобально в проекте, чтобы ссылаться на URL-адрес детальной информации о посте.
Этот URL-адрес имеет обязательный параметр – id извлекаемого поста блога. Идентификатор id объекта Post был включен в качестве позиционного аргумента, используя параметр args=[self.id].
Подробнее о функциях-резольверах URL-адресов можно узнать на странице https://docs.djangoproject.com/en/5.0/ref/urlresolvers/.
Давайте заменим URL-адреса детальной информации о посте в шаблонах новым методом get_absolute_url().
Отредактируйте файл blog/post/list.html, заменив строку:
<a href="{% url 'blog:post_detail' post.id %}">
строкой:
<a href="{{ post.get_absolute_url }}">
Теперь файл blog/post/list.html должен выглядеть следующим образом:
{% extends "blog/base.html" %}
{% block title %}My Blog{% endblock %}
{% block content %}
<h1>My Blog</h1>
{% for post in posts %}
<h2>
<a href="{{ post.get_absolute_url }}"> {{ post.title }}</a>
</h2>
<p class="date">
Published {{ post.publish }} by {{ post.author }}
</p>
{{ post.body|truncatewords:30|linebreaks }}
{% endfor %}
{% endblock %}
Откройте оболочку и исполните следующую ниже команду, чтобы запустить сервер разработки:
python manage.py runserver
Пройдите по URL-адресу http://127.0.0.1:8000/blog/ в своем браузере.
Ссылки на одиночные посты блога по-прежнему должны работать. Теперь Django формирует их, используя метод get_absolute_url() модели Post.