Go,構造体に値を格納しginテンプレートに出力をしたいがうまくできない。

実現したいこと

映画サイトのようなものを自作していましてその中でCRUD機能を作成しています。
その際の更新確認画面でつまずいてしまっていてご教授いただけると嬉しいです。

まず出来ている削除の個所のソースコードを記載します。
削除の実装ではパラメータのID
IDを受け取りDBから削除を行い削除完了画面へと続くようになっています。
var movies []*models.Movie型で実装を行いうまくいっています。

ここからが本題
更新は入力チェックを行い問題がなければc.PostFormで値を取得し
構造体に詰め、それを
c.HTML(http.StatusOK, "edit.html", gin.H{
"error": errMg,
"data": movies,
})
こちらで更新画面に渡してエラー文、入力された値の保持を行っています。
こちらの実装ですとexecuting "edit.html" at <.data>: range can't iterate overとエラーが吐かれてしまいます。
c.HTML(http.StatusOK, "edit.html", gin.H{
})
こちらのほうに入力されたものを一つ一つ記載して渡してあげれば問題ないのですが、まとめて渡したいです。
また構造体に関してですが更新のほうはvar movies models.MovieUpdateで削除のようにvar movies []*models.MovieUpdateのほうな記述ができませんでした。
少しポインタなどの理解が混在してしまっていてこちらに関してもご教授いただけると嬉しいです。

記載したエラー文に関してもdataの中身をrangeで回せないということは理解しているのですが、、

よろしくお願いいたします。

補足
edit.htmlは更新画面の初期表示の値表示にも使用しています。
MoviesEditGetHandler関数を使用

前提

gin.gormを用いて映画の検索サイトを自作しています。学習のため

発生している問題・エラーメッセージ

executing "edit.html" at <.data>: range can't iterate over

該当のソースコード

moviesContoroller.go

1★削除関数 2func MoviesDeleteGetHandler(c *gin.Context) { 3 id := c.Param("id") 4 var movies []*models.Movie 5 6 result := initializers.DB.Delete(&movies, id) 7 8 fmt.Println(result) 9 10 if result.Error != nil { 11 return 12 } 13 14 c.HTML(http.StatusOK, "delete_Comp.html", nil) 15} 16★更新確認関数 17func MoviesEditPostHandler(c *gin.Context) { 18 19 var errMg []string 20 var movies models.MovieUpdate 21 22 if c.PostForm("title") == "" { 23 errMg = append(errMg, "タイトルは必須項目です") 24 } 25 if c.PostForm("year") == "" { 26 errMg = append(errMg, "公開年は必須項目です。") 27 } 28 if c.PostForm("cast") == "" { 29 errMg = append(errMg, "キャストは必須項目です。") 30 } 31 if c.PostForm("extract") == "" { 32 errMg = append(errMg, "説明文は必須項目です。") 33 } 34 if c.PostForm("genre") == "" { 35 errMg = append(errMg, "ジャンルは必須項目です。") 36 } 37 38 movies.Id = c.PostForm("id") 39 movies.Title = c.PostForm("title") 40 movies.Year = c.PostForm("year") 41 movies.Cast = c.PostForm("cast") 42 movies.Extract = c.PostForm("extract") 43 movies.Genre = c.PostForm("genre") 44 45 if len(errMg) == 0 { 46 fmt.Println("no error ") 47 c.Redirect(http.StatusFound, "/edit_confirm") 48 } else { 49 c.HTML(http.StatusOK, "edit.html", gin.H{ 50 "error": errMg, 51 "data": movies, 52 }) 53 return 54 } 55 56} 57★更新画面初期表示input内の初期値設定のため 58func MoviesEditGetHandler(c *gin.Context) { 59 60 id := c.Param("id") 61 var movies []*models.Movie 62 63 result := initializers.DB.First(&movies, id) 64 65 if result.RowsAffected == 0 { 66 //省略 67 } 68 fmt.Println(&movies) 69 70 c.HTML(http.StatusOK, "edit.html", gin.H{"data": &movies}) 71}

model.go

1type Movie struct { 2 gorm.Model 3 Title string `gorm:"unique"` 4 Year int16 5 Casts []string `json:"cast" gorm:"-:all"` 6 Genres []string `json:"genres" gorm:"-:all"` 7 Href string 8 Extract string 9 Thumbnail string 10 ThumbnailWidth int16 `json:"thumbnail_width"` 11 ThumbnailHeight int16 `json:"thumbnail_height"` 12 Cast string 13 Genre string 14} 15 16type MovieUpdate struct { 17 Id string 18 Title string 19 Year string 20 Extract string 21 Cast string 22 Genre string 23}

edit.html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6</head> 7<body> 8 9{{range .data}} 10<form action="/manege/{{.ID}}" method="post"> 11 <input type="hidden" name="id" value="{{.ID}}"> 12<label for="title">Title</label> 13<input type="text" id="title" value="{{.Title}}" name="title"> 14<label for="year">Year</label> 15<input type="text" id="year" value="{{.Year}}" name="year"> 16<label for="cast">Cast</label> 17<textarea name="cast" id="cast" cols="30" rows="10">{{.Cast}}</textarea> 18<label for="genre">Genre</label> 19<input type="text" id="genre" value="{{.Genre}}" name="genre"> 20<label for="extract">Extract</label> 21<textarea name="extract" id="extract" cols="30" rows="10">{{.Extract}}</textarea> 22 23 24 25 <button type="submit">Edit Confirm</button> 26</form> 27{{end}} 28</body> 29</html>

補足情報(FW/ツールのバージョンなど)

go -v 1.20
windows
IDE goland

コメントを投稿

0 コメント