У меня есть простое случайное целое число в моем коде, которое я передаю в шаблон
min := 1
max := 1563
Photo := rand.Intn(max - min + 1)
fmt.Println(Photo)
tmpl.ExecuteTemplate(w, "index.html", struct {
Pages []Page
CurrentPage int
TotalPage int
NextPage int
PreviousPage int
LastPage int
ShowNext bool
ShowPrevious bool
Photo int
}{
Pages: pages,
CurrentPage: pageIndex + 1,
TotalPage: totalPaginationPage,
NextPage: pageIndex + 1,
PreviousPage: pageIndex - 1,
LastPage: totalPaginationPage - 1,
ShowNext: pageIndex+1 < totalPaginationPage,
ShowPrevious: pageIndex-1 >= 0,
Photo: Photo,
})
идея состоит в том, чтобы рандомизировать фото (у меня в папке 1563) поэтому в моем шаблоне
{{диапазон .страниц}}
<div id = "content">
<div class = "card">
<p>
<div class = "card-img">
<a href = "{{.Slug}} "> <img
src = "{{.Photo}}"
alt = ""
/></a>
</div>
<div class = "card-info">
<div class = "card-info-title">
<a href = "{{.Slug}} " >{{.Title}} </a>
</div>
src="{{.Photo}}" вылетает из шаблона, как будто переменная передана неправильно. Возможно, проблема в том, что это внутри цикла, поэтому мне нужно случайное число для каждой статьи, чтобы отобразить фотографию?
Есть ли другой способ сделать это прямо в шаблоне?
Обновлять
Благодаря руководству, которое у меня теперь есть
min := 1
max := 1563
Photos := make([]int, len(pages))
for i := range Photos {
Photos[i] = rand.Intn(max - min + 1)
}
tmpl.ExecuteTemplate(w, "index.html", struct {
Pages []Page
CurrentPage int
TotalPage int
NextPage int
PreviousPage int
LastPage int
ShowNext bool
ShowPrevious bool
Photo []int
}{
Pages: pages,
CurrentPage: pageIndex + 1,
TotalPage: totalPaginationPage,
NextPage: pageIndex + 1,
PreviousPage: pageIndex - 1,
LastPage: totalPaginationPage - 1,
ShowNext: pageIndex+1 < totalPaginationPage,
ShowPrevious: pageIndex-1 >= 0,
Photo: Photos,
})
и в шаблоне
{{range $idx, $page := .Pages}}
<div id = "content">
<div class = "card">
<p>
<div class = "card-img">
<a href = "{{.Slug}} "> <img
src = "{{index $.Photos $idx}}"
alt = ""
/></a>
</div>
<div class = "card-info">
<div class = "card-info-title">
<a href = "{{.Slug}} " >{{.Title}} </a>
</div>
<div class = "card-info-category">
<p>
tags:
</p>
<ul>
<li>
{{.Tags}}
</li>
</ul>
</div>
<div class = "card-info-date">
{{.Date}}
</div>
</div>
</p>
</div>
</div>
{{end}}
также пытался
<a href = "{{.Slug}} "> <img
src = "/public/suisse/suisse{{index $.Photos $idx}}.jpg"
alt = ""
/></a>
но, к сожалению, шаблоны перестают выполняться, как только я звоню
{{index $.Photos $idx}}
Я так понимаю, это какая-то опечатка с моей стороны?
ошибка не возвращается, но шаблон прекращает рендеринг, как только достигается тег {{.Photo}}
Метод ExecuteTemplate возвращает ошибку с описанием причины остановки рендеринга. Всегда обрабатывайте ошибки, особенно когда функция работает не так, как ожидалось.

Действие {{range}} изменяет точку, поэтому {{.Photo}} внутри {{range .Pages}} будет разрешено на элементы .Pages.
Используйте $ для ссылки на «внешнее», исходное значение, переданное при выполнении шаблона:
src = "{{$.Photo}}"
Хотя это только целое число, вы, вероятно, захотите использовать его в пути или URL-адресе, например:
src = "/path/to/images?id = {{$.Photo}}"
Примечание. Если вы хотите использовать разные изображения для всех страниц, вам нужно передать разные числа для каждой, а не только для одной. Затем добавьте поле Photo на страницу, а затем вы сможете ссылаться на него внутри {{range}} как {{.Photo}}, как в исходном коде.
Вы написали, что не можете изменить Page, так как оно взято из вашей базы данных. Если это так, то либо передайте фрагмент случайных чисел, либо получите доступ к ним с помощью index следующим образом:
min := 1
max := 1563
Photos := make([]int, len(pages))
for i := range Photos {
Photos[i] = rand.Intn(max - min + 1)
}
tmpl.ExecuteTemplate(w, "index.html", struct {
Pages []Page
CurrentPage int
TotalPage int
NextPage int
PreviousPage int
LastPage int
ShowNext bool
ShowPrevious bool
Photo []int
}{
Pages: pages,
CurrentPage: pageIndex + 1,
TotalPage: totalPaginationPage,
NextPage: pageIndex + 1,
PreviousPage: pageIndex - 1,
LastPage: totalPaginationPage - 1,
ShowNext: pageIndex+1 < totalPaginationPage,
ShowPrevious: pageIndex-1 >= 0,
Photo: Photos,
})
В шаблоне:
{{range $idx, $page := .Pages}}
<a href = "{{.Slug}} "><img
src = "{{index $.Photos $idx}}"
alt = ""/>
</a>
{{end}}
Или зарегистрируйте функцию random, которую вы можете вызывать из шаблона:
// Parse the template as you did, but first register a random function:
min, max := 1, 1563
tmpl, err := template.New("").Funcs(template.FuncMap{
"random": func() int { return rand.Intn(max - min + 1) },
}).ParseFiles("template-name.html")
И вы можете вызвать его из шаблона следующим образом:
{{range .Pages}}
<a href = "{{.Slug}} "><img
src = "{{random}}"
alt = ""/>
</a>
{{end}}
Спасибо это работает!! но я бы хотел, чтобы для каждой статьи было другое изображение, и теперь оно загружает одно и то же изображение для всех :(
Если вы хотите разные изображения для всех страниц, вы должны передать разные числа для каждой, а не только для одной. Затем добавьте поле Photo на страницу, а затем вы сможете ссылаться на него внутри {{range}} как {{.Photo}}, как в исходном коде.
гм, это будет 1 изображение на статью. Страница отображает результаты базы данных, поэтому я не думаю, что смогу добавить поле в эту структуру.
@devnull Добавлены 2 альтернативы: либо передать фрагмент случайных чисел, либо зарегистрировать функцию random, которая возвращает случайное число, и вызывать ее из шаблона.
большое спасибо, см. обновление, к сожалению, все еще не работает :(
@devnull Обратите внимание, что я назвал поле структуры Photos (обратите внимание на множественное число), а не Photo. Либо вы также переименовываете поле структуры, как это сделал я, либо, если вы этого не сделаете, вам нужно изменить ссылку в шаблоне на {{index $.Photo $idx}}. Они должны совпадать!
Какая ошибка возвращается из tmpl.ExecuteTemplate? В настоящее время приложение игнорирует эту ошибку.