【问题标题】:Go template ranging over struct of structsGo 模板覆盖结构的结构
【发布时间】:2017-07-19 01:45:19
【问题描述】:

我试图覆盖一个结构列表,其中包含 2 个结构。我在结构中正确填充数据没有问题,问题是当我尝试将它呈现到 HTML 中时。我无法显示任何内容。

这是我的第一个 go web 项目,我正在开发一个为小型企业销售汽车的网站。我的数据库设计为 1..M 的 Cars to Pics。所以在汽车主页上。我只想加载一张包含汽车细节的图片。我尝试为此使用地图,但是当我只想打印一张图片以在通用 ID 上使用正确的汽车详细信息时遇到了问题。所以我想使用第三个结构,我为每个 ID 拉出一张照片。

type Car struct {
    Id int
    Year, Make, Model, Price string
}

type Pics struct {
    Id int
    Path string
}


type CarDetail struct {
    Cars Car
    Pic Pics
}

func cars(w http.ResponseWriter, r *http.Request){
  //loads all the cars in the database
  cars := loadCars()
  carDetails := make([]CarDetail,0)
  carIds := make([]int,len(cars))
  for i := 0; i < len(cars); i++{
    //gets all the car IDs in the db
    carIds[i] = getCarID(cars[i]) 
    photoPath := loadSinglePhoto(carIds[i]) //now have the single photo
    n := CarDetail{Cars:cars[i],Pic:photoPath}
    carDetails = append(carDetails, n)
}

fmt.Println(carDetails) //getting car details the way I want
tpl.ExecuteTemplate(w, "cars", &carDetails)
}

在我传入结构之前的打印语句以我想要的方式为我提供了信息。

[{{20 2009 Honda Accord 5000} {20 public/pics/questionMark.jpg}} {{21 2009 Acura TLX 14000} {21 public/pics/kia.png}} {{22 2015 Kia Sportage 34000} {22 public/pics/kia.png}}]

现在当我尝试在 html 中呈现它时

{{range .}}
  <h3>{{.Cars.Make}} - {{.Cars.Model}} - {{.Cars.Year}}</h3>
  <img src="{{.Pic.Path}}" id="{{.Pic.Id}}">
{{end}}

请随意批评我的代码或提出其他建议。提前谢谢!

【问题讨论】:

  • 总是检查ExecuteTemplate返回的error"cars" 应该是模板名称而不是变量名称。您可以使用tpl.Execute(w, &amp;carsDetail),而不是ExecuteTemplate

标签: templates go struct


【解决方案1】:

一般性的一些评论:

  • 您的命名有点误导:Pics 仅包含一张图片,而不是很多(不是数组或地图);这同样适用于 CarDetail.Cars
  • 不知道您使用的是哪个数据库,我建议您构建一个返回汽车和(主要)图片的查询,因为按每辆汽车查找图片效果不佳
  • 我建议将模板作为文件存储在具有特定扩展名(例如“cars.gohtml”)的子文件夹中,然后使用 template.ParseGlob("templates/*.gohtml")

除此之外它应该可以工作,请在此处查看稍微重构的工作示例: https://play.golang.org/p/CPnad9FxaB

那么你自己的代码到底出了什么问题?

【讨论】:

  • 感谢您的评论。基本上,当我加载页面时,我在 cars.html 页面中看不到任何数据。我已经有一个模板文件夹。单个查询是一个很好的观点。你会建议为“主要”添加一个字段来拉出那张照片吗?我遇到的问题是它不会向页面呈现任何内容。如果我尝试一个,它会起作用,但是在 CarDetails 列表中的范围内不会在 html 页面上呈现任何内容
  • 奇怪的是,当我传入“CarDetail”列表时它工作正常,但是当我尝试从数据库中提取它时,它不起作用。我知道信息在那里,因为它在我执行模板之前打印得很好。即您提供的示例工作正常。但是对于我的示例来说,没有任何渲染。没有返回错误,页面加载,只是没有来自服务器端的数据。
  • 可能 go 模板没有观察到 HTML cmets ,所以也许你的“注释掉的 HTML”收到了你的数据 :) 用你的 cmets 再试一次并检查源代码您在浏览器中呈现的页面。
【解决方案2】:

所以我找到了罪魁祸首。奇怪的是,一些之前注释掉的 HTML 代码导致模板无法呈现。我不知道为什么。

<!--

<h1>Your Pictures:</h1>
{{range .Pics}}
<img class="insertedPics" src="{{.Path}}" alt="pic" id="{{.Id}}" 
height="500px" width="500px">
{{end}}

{{range .Cars}}
<h3>{{.Make}} - {{.Model}} - {{.Year}} </h3>
{{end}}

<img src="{{.Pic.Path}}" alt="car pic" id="{{.Car.Id}}" height="600px" width="600px">

-->        <-- Once I removed this, everything worked fine.

{{range .}}
<h3>{{.C.Make}} - {{.C.Model}}</h3>
<img src="{{.P.Path}}" alt="some pic" height="500px" width="500px" 
style="">
{{end}}

感谢您的帮助和建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多