2017-07-19 4 views
0

Ich versuche, über eine Liste einer Struktur, bestehend aus 2 Strukturen innerhalb davon. Ich habe kein Problem, die Daten in der Struktur korrekt zu füllen, das Problem ist, wenn ich versuche, es in den HTML-Code zu rendern. Ich kann nichts zur Schau stellen.Go-Vorlage Bereich über Struktur von Strukturen

Dies ist mein erstes Go-Web-Projekt und ich arbeite an einer Website, um Autos für ein kleines Unternehmen zu verkaufen. Meine Datenbank ist als 1..M von Autos zu Bildern gestaltet. Also auf der Hauptautoseite. Ich möchte nur 1 Bild mit den Details des Autos laden. Ich habe versucht, eine Karte dafür zu verwenden, aber ich stieß auf ein Problem, als ich nur 1 Bild ausdrucken wollte, um mit den richtigen Auto-Details auf der gemeinsamen ID zu gehen. Also dachte ich mir, eine dritte Struktur zu verwenden, die ich für jede ID aus einem Bild herausziehen würde.

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

Die Druckanweisung direkt bevor ich in der Struktur übergebe, gibt mir die Information, die ich beabsichtigte.

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

Jetzt, wenn ich versuche, es in den hTML-Code zu machen

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

meines Codes kritisch, frei zu sein Fühlen oder einen anderen Weg vorschlagen. Vielen Dank im Voraus!

+2

* Überprüfen Sie immer 'error', das von' ExecuteTemplate' zurückgegeben wird. Die "Autos" sollen Schablonename und nicht Variablenname sein. Anstelle von 'ExecuteTemplate' können Sie' tpl.Execute (w, & carsDetail) 'verwenden. – putu

Antwort

1

Einige Bemerkungen auf einer allgemeinen Ebene:

  • Ihre Namensgebung ist ein wenig irreführend: Bilder nur ein einziges Bild hält, nicht viele (kein Array oder Karte); Gleiches gilt für CarDetail.Cars
  • Ohne zu wissen, welche Datenbank Sie verwenden, würde ich empfehlen, eine Abfrage zu erstellen, die sowohl Autos als auch (primäres) Bild zurückgibt, da die Bilder von jedem einzelnen Auto gut aussehen werden
  • würde ich empfiehlt die Vorlagen als Dateien in einem Unterordner mit bestimmten Erweiterungen zu speichern (zB „cars.gohtml“) und dann template.ParseGlob verwenden („templates/*. gohtml“)

von Apart, dass es sollte funktionieren, ein leicht umgestaltetes Arbeitsbeispiel finden Sie hier: https://play.golang.org/p/CPnad9FxaB

Also was genau ich Geht es in deinem eigenen Code falsch?

+0

Vielen Dank für die Anmerkungen. Im Wesentlichen, wenn ich die Seite lade, sehe ich keine Daten in der cars.html Seite. Ich habe bereits einen Ordner für Vorlagen. Die einzelne Abfrage ist ein großartiger Punkt. Würden Sie empfehlen, ein Feld für "primär" hinzuzufügen, nur um dieses 1 Bild zu ziehen? Das Problem, das ich habe, ist es wird nichts auf der Seite rendern. Es funktioniert, wenn ich ein einzelnes versuche, aber das Umfassen über die Liste von CarDetails gibt nichts auf der html Seite wieder – Ben

+0

Was merkwürdig ist, dass es gut funktioniert, wenn ich in einer Liste von "CarDetail" übergebe, aber wenn ich versuche, es von zu ziehen die Datenbank, es funktioniert nicht.Ich weiß, dass die Information da ist, weil es direkt vor dem Ausführen der Vorlage ausgedruckt wird. d. h. Sie haben ein Beispiel zur Verfügung gestellt funktioniert gut. Aber für mein Beispiel oben nichts rendert. Es werden keine Fehler zurückgegeben und die Seite wird geladen, nur keine Daten von der Serverseite. – Ben

+0

Möglicherweise gehen Templating nicht beachten Sie die HTML-Kommentare , also vielleicht Ihre "auskommentierten HTML" erhalten Ihre Daten :) Versuchen Sie es erneut mit Ihren Kommentaren und überprüfen Sie den Quellcode der gerenderten Seite im Browser. – mhcbinder

0

So fand ich den Schuldigen. Seltsam genug, dass einige HTML-Code von früher auskommentiert wurden, was dazu führte, dass die Vorlage nicht gerendert wurde. Ich bin mir nicht sicher warum.

<!-- 

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

Vielen Dank für die Hilfe und Anregungen!

Verwandte Themen