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

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

5.6 Создание шаблонов представлений
2 из 5 шагов пройдено
0 из 9 баллов  получено

Создание шаблона списка постов

Давайте отредактируем файл 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="{% url 'blog:post_detail' post.id %}"> {{ post.title }}</a>
        </h2>
        <p class="date">
            Published {{ post.publish }} by {{ post.author }}
        </p>
        {{ post.body|truncatewords:30|linebreaks }}
    {% endfor %}
{% endblock %}

Шаблонный тег {% extends %} сообщает Django, что надо наследовать от шаблона blog/base.html.

Затем заполняются блоки title и content базового шаблона.

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

URL-адрес формируется с использованием предоставляемого веб-фреймворком Django шаблонного тега {% url %}.
Этот шаблонный тег позволяет формировать URL-адреса динамически по их имени.

Мы используем blog:post_detail, чтобы ссылаться на URL-адрес post_detail в именном пространстве blog.

Мы передаем необходимый параметр post.id, чтобы сформировать URL-адрес для каждого поста.

Для формирования URL-адресов в своих шаблонах следует всегда использовать шаблонный тег {% url %}, а не писать жестко привязанные URL-адреса. Такой подход упростит техническое сопровождение URL-адресов в будущем.

В теле поста применяются два шаблонных фильтра: truncatewords усекает значение до указанного числа слов, а linebreaks конвертирует результат в разрывы строк в формате HTML. При этом можно конкатенировать столько шаблонных фильтров, сколько потребуется; каждый из них будет применен к результату, сгенерированному предыдущим.

 

Доступ к приложению

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

python manage.py runserver

Пройдите по URL-адресу http://127.0.0.1:8000/blog/ в своем браузере, вы увидите, что все работает.

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

Вы должны увидеть что-то вроде этого:

 

Создание шаблона детальной информации о посте

Далее отредактируйте файл post/detail.html:

{% extends "blog/base.html" %}
{% block title %}{{ post.title }}{% endblock %}
{% block content %}
    <h1>{{ post.title }}</h1>
    <p class="date">
        Published {{ post.publish }} by {{ post.author }}
    </p>
    {{ post.body|linebreaks }}
{% endblock %}

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

Вы должны увидеть что-то вроде этого:

Взгляните на URL-адрес - он должен содержать автоматически генерируемый id поста. Например: /blog/1/.


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

а что делать если пытаешься добавить пост а твое же имя считают не правильным 

@Пирогов_Владислав_Дмитриевич, нажмите на значок лупы и выберите пользователя.

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

@Дмитрий_Селезнев у меня теперь новая проблема не показывается никакая информация Точнее содеражние поста

Изменен Владислав Пирогов

@Пирогов_Владислав_Дмитриевич, посты опубликованы(имеют статус Published)?

@Дмитрий_Селезнев, да

@Дмитрий_Селезнев

@Владислав_Пирогов, загрузите проект по ссылке https://mega.nz/filerequest/rANtUqzWHQ4, посмотрим в чём ошибка.

@Владислав_Пирогов, в представлениях, функция post_list возвращает не правильное значение. Должно быть: 

return render(request,
              'blog/post/list.html',
              {'posts': posts})

Также в шаблоне list.html, измените строчку:

{{ post.body|truncatewords:30|linebreaks }}

На 

{{ post.text|truncatewords:30|linebreaks }}

Это потому что вы изменили поле в модели. 

Изменен Илья Перминов

@Илья_Перминов, спасибо большое теперь всё работает), тех поддержка супер, это делает этот курс за его стоимость просто изумбрудом 

Всем привет, я не могу решить проблему при вызове http://127.0.0.1:8000/blog/5/ я вижу ошибку, все уже проверил но все ровно не работает. помогите понять в чем дело

@Николай_Глазков, проверьте этот маршрут в файле urls.py:

path('<int:id>/', views.post_detail, name='post_detail'),

Похоже есть пробел вначале шаблона ' <int:id>/', удалите его, должно быть так '<int:id>/'.

@Николай_Глазков, Решил вопрос дело было в status=Post.Status.PUBLISHED у меня был статус другой в постах

Что-то я упустил, откуда эта часть взялась? У меня без нее показывает

 

@Дмитрий_Чекмасов, посмотрите в конце этого шага "Создание шаблона детальной информации о посте", там и скрин первого поста есть.

Изменен Дмитрий Селезнев

@Дмитрий_Селезнев, куда смотреть не понял? Эту часть я видел, код в файл detail.html добавил, результат только такой

Изменен Дмитрий Чекмасов

@Дмитрий_Чекмасов, а есть ли добавленные посты в админке? Со статусом опубликовано.

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

@Дмитрий_Чекмасов, все три поста в БД не опубликованы.

@Дмитрий_Селезнев, что-то ничего не соображу, админка это что? Какой раздел мне повторить надо?

@Дмитрий_Чекмасов, 5.3.1-5.3.2, переходите по адресу http://127.0.0.1:8000/admin/, авторизуетесь, выбираете модель Post и редактируете посты, меняя их статус на опубликовано.

Изменен Дмитрий Селезнев

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

У меня вот такая ошибка 

@Илья_Бояринцев, загрузите архив проекта по ссылке https://mega.nz/filerequest/rANtUqzWHQ4.

@Илья_Бояринцев, В модели потерялось поле status:

status = models.CharField(max_length=2,
                              choices=Status.choices,
                              default=Status.DRAFT)

@Илья_Бояринцев, И после не забудьте выполнить миграции.

@Илья_Перминов, Спасибо! Только сейчас пишет  Post не имеет атрибут published, хотя я добавил опубликованные посты

@Илья_Бояринцев, видимо ошибка в написании AttributeError: type object 'Post' has no attribute 'published'. Did you mean: 'publish'?

@Илья_Бояринцев, Вы похоже пропустили модуль 6.4

@Илья_Перминов,Да. Я уже вычислил пропажу

Что я забыла сделать?

 

@Евдокия_Гайдукасова, можете прислать содержимое файла views.py ?

@Евдокия_Гайдукасова, загрузите архив проекта по ссылке https://mega.nz/filerequest/rANtUqzWHQ4, посмотрим в чём проблема.

@Илья_Перминов

from django.shortcuts import render
from .models import Post
from django.http import Http404
from django.shortcuts import  get_object_or_404

def post_list(request):
    posts = Post.published.all()
    return render(request,
                  'blog/post/list.html',
                  {'posts': posts})
#### функция post_lis


def post_detail(request, id):
    try:
        post = Post.published.get(id=id)

    except Post.DoesNotExist:
        raise Http404("No Post found.")

    return render(request,
                  'blog/post/detail.html',
                  {'post': post})

def post_list(request):
    posts = Post.published.all()
    return render(request,
                  'blog/post/list.html',
                  {'posts': posts})


def post_detail(request, id):
    post = get_object_or_404(Post,
                             id=id, status=Post.Status.PUBLISHED)
    return render(request,
                  'blog/post/detail.html',
                  {'post': post})

@Евдокия_Гайдукасова, пожалуйста загрузите весь проект, ссылка в предыдущем сообщении.

@Дмитрий_Селезнев, загрузила

@Евдокия_Гайдукасова, в файл models.py нужно добавить менеджер, про это было в этой лекции. Тоесть выше класса Post добавить:

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset()\
                      .filter(status=Post.Status.PUBLISHED)

А сам класс Post добавить указания, какой менеджер использовать:

    objects = models.Manager() # менеджер, применяемый по умолчанию
    published = PublishedManager() # конкретно-прикладной менеджер

Также нужно удалить дубли функций в файле views.py, у вас функция вывода списка постов и функция вывода поста дублируется по 2 раза. В итоге на данном этапе данный файл должен содержать следующее:

from .models import Post
from django.shortcuts import render, get_object_or_404


def post_list(request):
    posts = Post.published.all()
    return render(request,
                  'blog/post/list.html',
                  {'posts': posts})


def post_detail(request, id):
    post = get_object_or_404(Post,
                             id=id, status=Post.Status.PUBLISHED)
    return render(request,
                  'blog/post/detail.html',
                  {'post': post})

@Дмитрий_Селезнев, возникла похожая проблема, полез исправлять и утонул, меняю одно вылазит другое... загрузил архив свой тоже

UPD: разобрался, оказалось просто ошибки в словах были

Изменен Дмитрий Чекмасов

@Дмитрий_Чекмасов, ещё файл post/detail.html пустой.

@Дмитрий_Селезнев, спасибо, сейчас заполнен, архивировал проект до того как надо было его заполнять, при первом запуске

Здравствуйте, сделал всё, как описывал курс, ничего не пропускал. При запуске сервера вылезла такая ошибка:

при том что я создал посты в меню админа

подскажите, в чём может быть проблема? может я что-то упустил?

@Никита_Совалин, у нас адрес http://127.0.0.1:8000/blog/

@Дмитрий_Селезнев, спасибо за ответ. Я вручную дописал id поста и тут я даже затрудняюсь описать проблему.

если написать просто blog, вылезает такая кракозябра

Можете написать путь шаблона list.html, относительно корня проекта?

@Илья_Перминов, mysite/templates/blog/post/list.html

Можете прислать свой проект мне на почту, perminoff-ilya@yandex.ru Мне будет проще посмотреть и сказать вам в чем ошибка.

@Илья_Перминов, я отправил. Заранее спасибо за помощь

@Никита_Совалин, пожалуйста загрузите файл сюда https://mega.nz/filerequest/rANtUqzWHQ4, к отправленному файлу закрыт доступ.

@Дмитрий_Селезнев, загрузил

@Никита_Совалин, в файле settings.py измените строчку в списке TEMPLATES

'DIRS': [],

на следующую:

'DIRS': [BASE_DIR / 'templates'],

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

@Илья_Перминов, написал, всё заработало! Спасибо вам огромное! Курс кстати очень классный! 

@Илья_Перминов, Спасибо что добавили в лекцию, строчка тоже была пустая (версия Django 5.0.1)

@Максим_Михеев, это похоже больше зависит от редактора кода, PyCharm Pro это автоматом добавляет.