skip to Main Content

The problem is that on a web page that uses a selector to select a product type, the options (values) inside the selector are not displayed

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Products</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Список продуктов</h1>


<form id="addProductForm">
    <label for="productName">Product Name:</label>
    <input type="text" id="productName" name="productName" required>

    <label for="weight">Weight:</label>
    <input type="number" id="weight" name="weight" required>

    <label for="typeSelect">Product Type:</label>
    <select class="form-control" id="typeSelect" name="TypeID">
        {{ range .Rows}}
        <option value="{{.ProductType.IDType}}">{{ .ProductType.NameType }}</option>
        {{ end }}
    </select>

    <label for="unit">Unit:</label>
    <input type="text" id="unit" name="unit" required>

    <label for="description">Description:</label>
    <input type="text" id="description" name="description" required>

    <label for="pricePickup">Price Pickup:</label>
    <input type="number" id="pricePickup" name="pricePickup" required>

    <label for="priceDelivery">Price Delivery:</label>
    <input type="number" id="priceDelivery" name="priceDelivery" required>


    <button type="button" onclick="addProduct()">Add Product</button>
</form>


<table id="productTable">
    <tr>
        <th>ID продукта</th>
        <th>ID типа</th>
        <th>Название продукта</th>
        <th>Вес</th>
        <th>Единица измерения</th>
        <th>Описание</th>
        <th>Цена самовывоза</th>
        <th>Цена с доставкой</th>
    </tr>
    {{range .Rows}}
    <tr>
        <td>{{.ProductID}}</td>
        <td>{{.ProductType.NameType}}</td>
        <td>{{.ProductName}}</td>
        <td>{{.Weight}}</td>
        <td>{{.Unit}}</td>
        <td>{{.Description}}</td>
        <td>{{.PricePickup}}</td>
        <td>{{.PriceDelivery}}</td>
    </tr>
    {{end}}
</table>

<script>
    function addProduct() {
        // Получение данных из формы
        var form = document.getElementById("addProductForm");
        var formData = new FormData(form);

        // Отправка данных на сервер
        fetch("/add_product", {
            method: "POST",
            body: formData,
        })
            .then(response => response.json())
            .then(data => {
                // Обработка ответа от сервера
                console.log("Product created:", data);

                // Очистка формы или выполнение других действий при необходимости
                form.reset();
            })
            .catch(error => console.error("Error:", error));
    }


</script>

</body>
</html>

Although this part of the code with the table output works perfectly

{{range .Rows}}
<tr>
    <td>{{.ProductID}}</td>
    <td>{{.ProductType.NameType}}</td>
    <td>{{.ProductName}}</td>
    <td>{{.Weight}}</td>
    <td>{{.Unit}}</td>
    <td>{{.Description}}</td>
    <td>{{.PricePickup}}</td>
    <td>{{.PriceDelivery}}</td>
</tr>
{{end}}

I want to take the data itself from a table representing such a structure

package product_types

type ProductTypes struct {
    IDType   string `json:"type_id"`
    NameType string `json:"type_name"`
}

The result of the current code now looks like this

result1

I tried changing it to this

<label for="typeSelect">Product Type:</label>
<select class="form-control" id="typeSelect" name="TypeID">
    {{ range .Rows}}
    <option value="{{.ProductType.IDType}}">{{ .ProductType.NameType }}</option>
    {{ end }}
</select>

The result became better, but in the end there were duplicates

result2

2

Answers


  1. Chosen as BEST ANSWER

    I found the answer to my question - I didn’t add the path to the ProductTypes table in app.go

    } else if req.URL.Path == "/products.html" {
            log.Printf("Обслуживание HTML-файла: %sn", productsHTMLPath)
    
            dataRows, err := repoProduct.FindAllProduct(context.TODO()) // Используйте функцию для получения продуктов
            if err != nil {
                http.Error(res, fmt.Sprintf("Запрос не выполнен: %v", err), http.StatusInternalServerError)
                return
            }
    
            dataRows1, err := repo.FindAll(context.TODO()) // Используйте функцию для получения типов продуктов
            if err != nil {
                http.Error(res, fmt.Sprintf("Запрос не выполнен: %v", err), http.StatusInternalServerError)
                return
            }
    
            tmpl, err := template.ParseFiles(productsHTMLPath)
            if err != nil {
                http.Error(res, fmt.Sprintf("Не удалось парсирование шаблона: %v", err), http.StatusInternalServerError)
                return
            }
    
            Rows := struct {
                Products     []products2.Product
                ProductTypes []product_types2.ProductTypes
            }{
                Products:     dataRows,
                ProductTypes: dataRows1,
            }
    
            err = tmpl.Execute(res, Rows)
            if err != nil {
                http.Error(res, fmt.Sprintf("Не удалось выполнить шаблон: %v", err), http.StatusInternalServerError)
            }
        }
    

    Initially the code looked like this:

    } else if req.URL.Path == "/products.html" {
                log.Printf("Обуслуживание HTML-файла: %sn", productsHTMLPath)
    
                dataRows, err := repoProduct.FindAllProduct(context.TODO()) // Используйте функцию для получения продуктов
                if err != nil {
                    http.Error(res, fmt.Sprintf("Запрос не выполнен: %v", err), http.StatusInternalServerError)
                    return
                }
    
                tmpl, err := template.ParseFiles(productsHTMLPath)
                if err != nil {
                    http.Error(res, fmt.Sprintf("Не удалось парсирование шаблона: %v", err), http.StatusInternalServerError)
                    return
                }
    
                err = tmpl.Execute(res, struct{ Rows []products2.Product }{dataRows})
                if err != nil {
                    http.Error(res, fmt.Sprintf("Не удалось выполнить шаблон: %v", err), http.StatusInternalServerError)
                }
            }
    

    product.html:

    <label for="typeSelect">Product Type:</label>
        <select class="form-control" id="typeSelect" name="TypeID">
            {{ range .ProductTypes}}
            <option value="{{.IDType}}">{{ .NameType }}</option>
            {{ end }}
    </select>
    

  2. Check Data in Go Template:
    Ensure that the data you are passing to the template ({{ range .Rows }}) contains the expected information about product types ({{ .ProductType.IDType }} and {{ .ProductType.NameType }}). You can print the data for debugging purposes:

    <label for="typeSelect">Product Type:</label>
    <select class="form-control" id="typeSelect" name="TypeID">
        {{ range .Rows }}
            <option value="{{ .ProductType.IDType }}">{{ .ProductType.NameType }}</option>
        {{ end }}`enter code here`
    </select>
    

    Debugging in Go Server:
    Check the server-side code where you render the HTML template. Ensure that you are fetching and passing the data correctly to the template. You may use fmt.Println or logging to inspect the data being passed to the template.

    func renderTemplate(w http.ResponseWriter, tmpl string, data interface{}) {
        err := templates.ExecuteTemplate(w, tmpl+".html", data)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search