цикл через оператор for, используя if / else с nunjucks и json

Я пытаюсь перебрать вложенный файл json с помощью nunjucks, дать каждому типу объекта определенный макет и отсортировать все по дате.

Итак, в моем случае у меня есть две коллекции событий и видео. Обе коллекции будут содержать множество событий и видео.

Мой файл называется /content.json и имеет следующую структуру:

{
    media: {
        events: [
            {
            content_id: "1",
            content_type: "event",
            date: "01-11-2019",
            etc: "etc"
            },
            {
            content_id: "2",
            content_type: "event",
            date: "01-08-2019",
            etc: "etc"
            }
        ],
        videos: [
            {
            content_id: "3",
            content_type: "video",
            date: "01-12-2019",
            etc: "etc"
            },
            {
            content_id: "4",
            content_type: "video",
            date: "01-09-2019",
            etc: "etc"
            }
        ]
    }
}

Я попытался получить другой объект, назначенный с помощью оператора if / else, а затем использовать цикл for для циклического просмотра массива, но это не удалось, см. Ниже:

{% for item in content.media %}
    {% if item == events %}
        {% for item in content.media.events %}
                {% include "components/event.njk" %}
        {% endfor %}
    {% elif item ==  video %}
        {% for item in content.media.videos %}
                {% include "components/video.njk" %}
        {% endfor %}
    {% endif %}
{% endfor %}

Мне никогда не приходилось пытаться отсортировать весь контент по дате, но я обнаружил:

{% for item in items|sort(attribute='date')%} 

Может ли кто-нибудь направить меня в правильном направлении?

Заранее спасибо.

AENM

Thnx Aikon, у меня есть это решение, и оно работает. Но я в своем хочу отсортировать весь контент по дате. И зная, что nunjucks предоставляет возможность сортировки, все содержимое должно быть в одном операторе for. Может быть, вы скажете, что это невозможно, вам нужен какой-то javascript для сортировки. А может у вас есть другое решение?   —  person AENM    schedule 16.01.2020

См. также:  Автоматическое применение изменений при сохранении в vscode
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. AENM

    Этот код выводит каналы, разделенные по типу элементов (событие или видео).

    {% for event in content.media.events | sort(attribute = 'date') %}
        {% include "components/event.njk" %}
    {% endfor %}
    
    {% for video in content.media.videos | sort(attribute = 'date') %}
        {% include "components/video.njk" %}
    {% endfor %}
    

    Если вам нужно вывести смешанный канал, вы должны объединить массивы в один и запустить его (к счастью, у каждого элемента уже есть тип):

    {% for item in [].concat(content.media.events, content.media.videos) | sort(attribute = 'date') %}
        {% include "components/" + item.content_type + ".njk" %}
    {% endfor %}
    

    Спасибо, Aikon, я попробовал первый, и он сработал, но мне пришлось перейти на sort (‘date’). Второй возвратил ошибку: TemplateContentRenderError был брошен ›(./site/index.njk) Ошибка: шаблон не найден: components / undefined.njk. Я тестировал это, и я имею дело с функцией concat. Он не работает должным образом? :-( person AENM; 22.01.2020

    Я исправил ошибку: ваши данные содержат не type-field, а content_type. person AENM; 23.01.2020

    Смотрите мой ответ выше. Это был content.media, который должен был быть media.content. Теперь все работает нормально !! person AENM; 23.01.2020

    Да исправить. Но я не хочу вдаваться в подробности, так как это скорее каркасный тип сборки. Но мне, вероятно, придется что-то делать с moment.js и github.com/techmsi/nunjucks-date. Еще раз спасибо за советы и вашу помощь. person AENM; 24.01.2020

  2. AENM

    Айкон,

    Я понял!! Это была очередная опечатка, вы поменяли СМИ и события. (ты пытался держать меня в курсе ?! :-)) Но вот почему конкат не сработал !! Итак, это окончательный рабочий результат:

    {% for item in [].concat(media.content.events, media.content.videos) | sort(attribute = 'date') %}
         {% include "components/" + item.type + ".njk" %}
    {% endfor %}
    

    Только дата не в правильном порядке, но я думаю, что это связано с моей настройкой сетки.

    Спасибо, что помогли мне …

    Я думаю, что у вас проблема с датой, потому что nunjucks сравнивает events.date как строки, а не дату. Поэтому вам следует создать собственный настраиваемый фильтр вместо стандартного sort. person AENM; 23.01.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: