Условно отображать более одного раздела в Hugo

Я хочу отобразить все файлы уценки в каждой папке, кроме статической, на моей домашней странице веб-сайта, один из способов сделать это — использовать союз в Хьюго, но по мере увеличения количества папок я вижу, что повторяю союзы по всему place (код с объединением закомментирован, кстати, работает), поэтому я подумал, что лучше использовать слайс, но когда я пытаюсь использовать слайс, я получаю следующую ошибку:

не удалось отобразить страницы: не удалось отобразить «дом»: «(Путь к каталогу)\layouts\index.html:12:19»: не удалось выполнить шаблон в <.Pages>: не удается оценить поля Страницы в строке типа

структура каталогов

код для index.html

{{ define "main" }}
<ul class = "homepage-topic-sections-container">
    {{$sectionNames := slice "posts" "problems" "tutorials"}}
    {{range $index, $sectionName := $sectionNames}}
    {{ range where .Pages "Section" $sectionName }}
    {{/*
    {{ range union (union
    (where .Pages "Section" "posts")
    (where .Pages "Section" "problems"))
    (where .Pages "Section" "tutorials")
    }}
    */}}
    <li>
        <section class = "homepage-topic-section">
            <h1 class = "topic-heading"><a href = "{{.Permalink}}">{{.Title}} </a></h1>
            <div>
                {{ range .Pages }}
                <h3><a href = "{{.Permalink}}">{{.Title}} &middot; {{.Date.Format "January 2, 2006"}}</a></h3>
                {{ end }}
            </div>
        </section>
    </li>
    {{end}}
    {{end}}

</ul>
{{ end }}

🤔 А знаете ли вы, что...
Go используется для создания контейнеров Docker.


1
72
1

Ответ:

Решено

https://gohugo.io/templates/introduction/#the-dot:

Контекст (он же «точка»)

Наиболее легко упускаемая из виду концепция шаблонов Go заключается в том, что {{ . }} всегда относится к текущему контексту.

  • На верхнем уровне вашего шаблона это будет набор данных, доступный для него.
  • Однако внутри итерации он будет иметь значение текущего элемента в цикле; т. е. {{ . }} больше не будет относиться к данным, доступным для всей страницы.

В приведенном ниже коде точка в .Pages имеет значение текущего элемента в первом range действии. Тип этого значения — строка, и в нем нет поля Pages. Вот почему это не удалось с execute of template failed at <.Pages>: can’t evaluate field Pages in type string.

{{ define "main" }}
<ul class = "homepage-topic-sections-container">
    {{$sectionNames := slice "posts" "problems" "tutorials"}}
    {{range $index, $sectionName := $sectionNames}}
    {{ range where .Pages "Section" $sectionName }}
                   ^^^^^^

Одним из возможных решений является использование $. для доступа к глобальному контексту: .Pages ==> $.Pages.

Возможно, лучшим решением будет вместо этого перечислить разделы исключения. Тогда вам не нужно изменять код при добавлении дополнительных папок:

{{ define "main" }}
<ul class = "homepage-topic-sections-container">
    {{ range where .Pages "Section" "! = " "static" }}
    <li>