Django 5 для начинающих

Прогресс по курсу:  9/1004

6.1 Работа с URL
3 из 3 шагов пройдено

Видоизменение представлений

Теперь необходимо видоизменить параметры представления post_detail, чтобы они соответствовали новым параметрам URL-адреса, и использовать их для извлечения соответствующего объекта Post.

Откройте файл views.py и отредактируйте представление post_detail, как показано ниже:

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post,
                             status=Post.Status.PUBLISHED,
                             slug=post,
                             publish__year=year,
                             publish__month=month,
                             publish__day=day)
    return render(request,
                  'blog/post/detail.html',
                  {'post': post})

Мы видоизменили представление post_detail, чтобы использовать аргументы year, month, day и post и извлекать опубликованный пост с заданным слагом и датой публикации.

Ранее, добавив в поле slug значение параметра unique_for_date='publish' модели Post, мы обеспечили, чтобы был только один пост со слагом на заданную дату. Таким образом, используя дату и слаг, можно извлекать одиночные посты.

Видоизменение канонического URL-адреса постов

Также необходимо видоизменить параметры канонического URL-адреса для постов блога, чтобы они сочетались с новыми параметрами URL-адреса.

Откройте файл models.py приложения blog и отредактируйте метод get_absolute_url(), как показано ниже:

class Post(models.Model):
    # ...
    def get_absolute_url(self):
        return reverse('blog:post_detail',
                       args=[self.publish.year,
                             self.publish.month,
                             self.publish.day,
                             self.slug])


Запустите сервер разработки, набрав следующую ниже команду в командной оболочке:

python manage.py runserver

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

Взгляните на URL-адрес – он должен выглядеть как http://127.0.0.1:8000/blog/2023/5/20/kak-rabotaet-django/.

Вы разработали дружественные для поисковой оптимизации URL-адреса постов блога.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Взгляните на URL-адрес – он должен выглядеть как http://127.0.0.1:8000/2023/5/20/kak-rabotaet-django/.

А мы же не меняли в mysite/urls.py строку  path('blog/', include('blog.urls', namespace='blog')), получается ссылка должна быть вида:
http://127.0.0.1:8000/blog/2023/5/20/kak-rabotaet-django/

Я вроде же ничего не пропустил?)

Ну и в предыдущем разделе было так указано:

Присоединив даты, мы приведем URL-адрес детальной информации о посте к следующему виду: /blog/2022/1/1/who-was-django-reinhardt/

Изменен Нарбеков Марсель

@Нарбеков_Марсель, нет, не пропустили, blog должен быть в адресе, видимо скрин делался по версии из 7го модуля.

В ближайшее время исправлю, спасибо что обратили на это внимание.

@Нарбеков_Марсель, скрин исправил.

@Дмитрий_Селезнев, спасибо!

Почему при указании в функции get_object_or_404, slug=slug (при том, что post_detail будет принимать slug, а не post соответственно), ничего не работает?

@Александр_Ёлшин, посмотрите какие параметры мы получаем из url и передаём в представление:

path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.post_detail, name='post_detail'),

В данном случае, при slug=slug, параметру slug просто неоткуда взяться, /<slug:post>/ тут slug это спецификатор, а post это параметр.