Python. Не могу разобраться как правильно получить id во вью-функции

Рейтинг: 0Ответов: 1Опубликовано: 26.07.2023

Есть список словарей:

posts = [
    {
        'id': 0,
        'location': 'Остров отчаянья',
        'date': '30 сентября 1659 года',
        'category': 'travel',
        'text': '''Наш корабль, застигнутый в открытом море
                страшным штормом, потерпел крушение.
                Весь экипаж, кроме меня, утонул; я же,
                несчастный Робинзон Крузо, был выброшен
                полумёртвым на берег этого проклятого острова,
                который назвал островом Отчаяния.''',
    },
    {
        'id': 1,
        'location': 'Остров отчаянья',
        'date': '1 октября 1659 года',
        'category': 'not-my-day',
        'text': '''Проснувшись поутру, я увидел, что наш корабль сняло
                с мели приливом и пригнало гораздо ближе к берегу.
                Это подало мне надежду, что, когда ветер стихнет,
                мне удастся добраться до корабля и запастись едой и
                другими необходимыми вещами. Я немного приободрился,
                хотя печаль о погибших товарищах не покидала меня.
                Мне всё думалось, что, останься мы на корабле, мы
                непременно спаслись бы. Теперь из его обломков мы могли бы
                построить баркас, на котором и выбрались бы из этого
                гиблого места.''',
    },
]

В данной функции некорректно взят пост по id, нужно пройти по всему списку и найти нужный пост:

def post_detail(request, id):
    template = 'blog/detail.html'
    try:
        posts[id]
        context = {'post': posts[id]}
    except IndexError:
        raise Http404("Post not found")
    return render(request, template, context)

Ответы

▲ 0

Не знаю, причём тут django, но если у вас есть лист с json объектами, то можно просто пройтись циклом по ним и возвращать нужный json объект с нужным вам id, что гораздо проще.

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

posts = [
    {
        'id': 0,
        'location': 'Остров отчаянья',
        'date': '30 сентября 1659 года',
        'category': 'travel',
        'text': '''Наш корабль, застигнутый в открытом море
                страшным штормом, потерпел крушение.
                Весь экипаж, кроме меня, утонул; я же,
                несчастный Робинзон Крузо, был выброшен
                полумёртвым на берег этого проклятого острова,
                который назвал островом Отчаяния.''',
    },
    {
        'id': 1,
        'location': 'Остров отчаянья',
        'date': '1 октября 1659 года',
        'category': 'not-my-day',
        'text': '''Проснувшись поутру, я увидел, что наш корабль сняло
                с мели приливом и пригнало гораздо ближе к берегу.
                Это подало мне надежду, что, когда ветер стихнет,
                мне удастся добраться до корабля и запастись едой и
                другими необходимыми вещами. Я немного приободрился,
                хотя печаль о погибших товарищах не покидала меня.
                Мне всё думалось, что, останься мы на корабле, мы
                непременно спаслись бы. Теперь из его обломков мы могли бы
                построить баркас, на котором и выбрались бы из этого
                гиблого места.''',
    },
    {
        'id': 200,
        'location': 'Таинственный лес',
        'date': '12 мая 1723 года',
        'category': 'adventure',
        'text': '''Завтракая в уединенной хижине в лесу,
                я услышал загадочный шум среди деревьев.
                Решив отправиться на разведку, я оказался
                в параллельной вселенной, где магия и
                сказочные существа вплетались в реальность.''',
    },
    {
        'id': 300,
        'location': 'Пустынная равнина',
        'date': '7 июля 1845 года',
        'category': 'exploration',
        'text': '''Путешествие сквозь пустынную равнину
                оказалось более опасным, чем я предполагал.
                Запасы воды иссякли, и я вынужден был искать
                оазис, чтобы выжить в этой необъятной пустыне.''',
    }
]

Далее импортируем библиотеку для работы с json и создадим функцию, которая проходится по всем объектам json и проверяет её id по условию, в случае если пост не найден, вернём None, иначе возвращаем объект json.

def get_post_by_id(posts, post_id):
    for post in posts:
        if post['id'] == post_id:
            return json.dumps(post, ensure_ascii=False, indent=4)
    return None

Проверим работу данной функции. Скажем, что я хочу найти пост с id = 200. Если поста не будет, вернём Пост с id <номер id> не найден.

post_id_to_retrieve = 200
post_json = get_post_by_id(posts, post_id_to_retrieve)
if post_json:
    print(post_json)
else:
    print(f"Пост с id={post_id_to_retrieve} не найден.")

Вывод в терминале:

{
    "id": 200,
    "location": "Таинственный лес",
    "date": "12 мая 1723 года",
    "category": "adventure",
    "text": "Завтракая в уединенной хижине в лесу,\n
       я услышал загадочный шум среди деревьев.\n
    Решив отправиться на разведку, я оказался\n
  в параллельной вселенной, где магия и\n                
сказочные существа вплетались в реальность."
}