clone () генерирует динамическую c строку, но с тем же идентификатором и именем - PullRequest
0 голосов
/ 12 апреля 2020

Я использую JavaScript в своем шаблоне django для динамического создания строк, но когда я нажимаю на кнопку добавления строки, первая <tr> копируется с тем же именем и идентификатором, и поэтому, когда я отправляю данные, она переопределяется .

Вот HTML:

<html>
<head>

    <title>gffdfdf</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="/static/jquery.formset.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

</head>
<body>

<div class="container">

    <form id="myForm" action="" method="post" class="">
        {% csrf_token %}
        <h2> Team</h2>
        {% for field in form %}
        {{ field.errors }}
        {{ field.label_tag }} : {{ field }}
        {% endfor %}
        {{ form.player.management_form }}

        <h3> Product Instance(s)</h3>
        <table id="table-product" class="table">
            <thead>
            <tr>
                <th>player name</th>
                <th>highest score</th>
                <th>age</th>
            </tr>

            </thead>
            {% for player in form.player %}
            <tbody class="player-instances">

            <tr>
                <td>{{ player.pname }}</td>
                <td>{{ player.hscore }}</td>
                <td>{{ player.age }}</td>
                <td><input id="input_add" type="button" name="add" value=" Add More "
                           class="tr_clone_add btn data_input"></td>

            </tr>

            </tbody>
            {% endfor %}
        </table>
        <button type="submit" class="btn btn-primary">save</button>

    </form>
</div>

<script>
    var i = 1;
    $("#input_add").click(function () {
        $("tbody tr:first").clone().find(".data_input").each(function () {
            if ($(this).attr('class') == 'tr_clone_add btn data_input') {
                $(this).attr({
                    'id': function (_, id) {
                        return "remove_button"
                    },
                    'name': function (_, name) {
                        return "name_remove" + i
                    },
                    'value': 'Remove'
                }).on("click", function () {
                    var a = $(this).parent();
                    var b = a.parent();
                    i = i - 1
                    $('#id_form-TOTAL_FORMS').val(i);
                    b.remove();

                    $('.player-instances tr').each(function (index, value) {
                        $(this).find('.data_input').each(function () {
                            $(this).attr({
                                'id': function (_, id) {
                                    console.log("id", id)
                                    var idData = id;
                                    var splitV = String(idData).split('-');
                                    var fData = splitV[0];
                                    var tData = splitV[2];
                                    return fData + "-" + index + "-" + tData
                                },
                                'name': function (_, name) {
                                    console.log("name", name)
                                    var nameData = name;
                                    var splitV = String(nameData).split('-');
                                    var fData = splitV[0];
                                    var tData = splitV[2];
                                    return fData + "-" + index + "-" + tData
                                }
                            });
                        })
                    })
                })
            } else {
                $(this).attr({
                    'id': function (_, id) {
                        console.log("id", id)

                        var idData = id;
                        var splitV = String(idData).split('-');
                        var fData = splitV[0];
                        var tData = splitV[2];
                        return fData + "-" + i + "-" + tData
                    },
                    'name': function (_, name) {
                        console.log("name", name)

                        var nameData = name;
                        var splitV = String(nameData).split('-');
                        var fData = splitV[0];
                        var tData = splitV[2];
                        return fData + "-" + i + "-" + tData
                    }
                });

            }
        }).end().appendTo("tbody");
        $('#id_form-TOTAL_FORMS').val(1 + i);
        i++;

    });
</script>

</body>
</html>

и результат из вышеприведенного кода при нажатии Add More:

<tbody class="player-instances">

            <tr>
                <td><input type="text" name="form-0-pname" id="id_form-0-pname"></td>
                <td><input type="number" name="form-0-hscore" id="id_form-0-hscore"></td>
                <td><input type="number" name="form-0-age" id="id_form-0-age"></td>
                <td><input id="input_add-0-undefined" type="button" name="add-0-undefined" value=" Add More " class="tr_clone_add btn data_input"></td>

            </tr>

            <tr>
                <td><input type="text" name="form-0-pname" id="id_form-0-pname"></td>
                <td><input type="number" name="form-0-hscore" id="id_form-0-hscore"></td>
                <td><input type="number" name="form-0-age" id="id_form-0-age"></td>
                <td><input id="remove_button" type="button" name="name_remove1" value="Remove" class="tr_clone_add btn data_input"></td>

            </tr></tbody>

, тогда как ожидаемый результат равен this:

<tbody class="player-instances">

            <tr>
                <td><input type="text" name="form-0-pname" id="id_form-0-pname"></td>
                <td><input type="number" name="form-0-hscore" id="id_form-0-hscore"></td>
                <td><input type="number" name="form-0-age" id="id_form-0-age"></td>
                <td><input id="input_add-0-undefined" type="button" name="add-0-undefined" value=" Add More " class="tr_clone_add btn data_input"></td>

            </tr>

            <tr>
                <td><input type="text" name="form-1-pname" id="id_form-1-pname"></td>
                <td><input type="number" name="form-1-hscore" id="id_form-1-hscore"></td>
                <td><input type="number" name="form-1-age" id="id_form-1-age"></td>
                <td><input id="remove_button" type="button" name="name_remove1" value="Remove" class="tr_clone_add btn data_input"></td>

            </tr></tbody>

Что я могу сделать, чтобы при добавлении новой строки она получала новые id и name?

1 Ответ

2 голосов
/ 12 апреля 2020

Это можно сделать, пройдя по последней строке, добавленной в таблицу, и затем обновив все атрибуты id & name, добавив новое увеличенное значение i, например:

$("tbody tr:last :input").each(function() {
   $(this).attr({
      'id': function(_, id) {
        return id.replace(/\d/g, i)
      },
      'name': function(_, name) {
        return name.replace(/\d/g, i)
      }
   })
})

Рабочая демоверсия:

var i = 1;
$("#input_add").click(function() {
  $("tbody tr:first").clone().find(".data_input").each(function() {
    if ($(this).attr('class') == 'tr_clone_add btn data_input') {
      $(this).attr({
        'id': function(_, id) {
          return "remove_button" + i
        },
        'name': function(_, name) {
          return "name_remove" + i
        },
        'value': 'Remove'
      })
    }
  }).end().appendTo("tbody");

  $("tbody tr:last :input").each(function() {
    $(this).attr({
      'id': function(_, id) {
        return id.replace(/\d/g, i)
      },
      'name': function(_, name) {
        return name.replace(/\d/g, i)
      },
    })
  })

  //$('#id_form-TOTAL_FORMS').val(1 + i);
  i++;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody class="player-instances">
    <tr>
      <td><input type="text" name="form-0-pname" id="id_form-0-pname"></td>
      <td><input type="number" name="form-0-hscore" id="id_form-0-hscore"></td>
      <td><input type="number" name="form-0-age" id="id_form-0-age"></td>
      <td><input id="input_add" type="button" name="add" value=" Add More " class="tr_clone_add btn data_input"></td>
    </tr>
  </tbody>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...