Используйте Random Int для фотографии в шаблоне Go

У меня есть простое случайное целое число в моем коде, которое я передаю в шаблон

            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}} 

Я так понимаю, это какая-то опечатка с моей стороны?

Какая ошибка возвращается из tmpl.ExecuteTemplate? В настоящее время приложение игнорирует эту ошибку.

Charlie Tumahai 27.11.2022 19:41

ошибка не возвращается, но шаблон прекращает рендеринг, как только достигается тег {{.Photo}}

devnull 27.11.2022 19:43

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

Charlie Tumahai 27.11.2022 20:11
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
3
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Действие {{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}}

Спасибо это работает!! но я бы хотел, чтобы для каждой статьи было другое изображение, и теперь оно загружает одно и то же изображение для всех :(

devnull 27.11.2022 19:54

Если вы хотите разные изображения для всех страниц, вы должны передать разные числа для каждой, а не только для одной. Затем добавьте поле Photo на страницу, а затем вы сможете ссылаться на него внутри {{range}} как {{.Photo}}, как в исходном коде.

icza 27.11.2022 19:55

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

devnull 27.11.2022 20:03

@devnull Добавлены 2 альтернативы: либо передать фрагмент случайных чисел, либо зарегистрировать функцию random, которая возвращает случайное число, и вызывать ее из шаблона.

icza 27.11.2022 21:41

большое спасибо, см. обновление, к сожалению, все еще не работает :(

devnull 28.11.2022 01:43

@devnull Обратите внимание, что я назвал поле структуры Photos (обратите внимание на множественное число), а не Photo. Либо вы также переименовываете поле структуры, как это сделал я, либо, если вы этого не сделаете, вам нужно изменить ссылку в шаблоне на {{index $.Photo $idx}}. Они должны совпадать!

icza 28.11.2022 08:01

Другие вопросы по теме