Получение значения элемента в шаблоне django для цикла

#django #forms #django-models #django-templates

#django #формы #django-модели #django-шаблоны

Вопрос:

Используя django, у меня есть форма, в которую пользователь вводит свой 'position' . Пользователь может добавлять несколько позиций. Пользователь также может удалять позиции. При этом стоит отметить две вещи:

1) в форме есть две кнопки, 'Add' и 'Delete' .

2) Я использую цикл for в шаблоне для заполнения списка позиций и удаления кнопок.

Это то, что у меня сейчас есть:

 # in template
<tr>
    <td>Position</td>
    <td>{{ form.position }} 
        <input type="submit" value="Add" , name='action'/>
    </td>
</tr>
<tr>
    <td> </td>
    <td>
        {% for position in positions %}
            {{ position}}
            <input type="submit" value="Delete {{position }}", name='action'/> 
        {% endfor %}
    </td>
</tr>

# in views.py
    ...
    if action == 'Add':
        positions.append(request.POST['position'])
        return render_to_response(...)
    if 'Delete' in action:
        positions.remove(request.POST['action'][7:])
        return render_to_response('...)
  

Это кажется очень неэлегантным способом выполнить часть «Удаления».

Есть ли лучший способ получить значение position , без необходимости втискивать дополнительную информацию в 'Delete' submit button , а затем отрезать ее, чтобы получить ее значение?

Ответ №1:

Я вижу здесь три варианта:

  1. Используйте поле флажка для каждой позиции и одну кнопку «Удалить». В этом случае пользователь может выбрать несколько позиций для удаления, и вы можете легко получить их идентификаторы из запроса.

  2. Используйте скрытое поле position и немного Javascript для его заполнения. Если вы используете jquery, это может быть:

     <input type="hidden" name="position" value="" />
    
    {% for position in positions %}
      <input type="submit" value="Delete" name="action" data-position="{{ position }}" />;
    {% endfor %}
    
    <script type="text/javascript">
       var $position_input = $("input[name='position']");
       $("input[name='action'][value='Delete'].click(function(e) {
          var $this = $(this);
          var position = $this.data("position");
          $position_input.val(position);
       });
    </script>
      
  3. Вставьте идентификатор позиции в атрибут name, вот так:

     <input type="submit" value="Delete" name="delete-position.{{ position }} />
      

    В функции просмотра вам нужно будет просмотреть все данные в request.POST и найти все элементы, которые начинаются с delete-position , а затем использовать нарезку.