#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:
Я вижу здесь три варианта:
-
Используйте поле флажка для каждой позиции и одну кнопку «Удалить». В этом случае пользователь может выбрать несколько позиций для удаления, и вы можете легко получить их идентификаторы из запроса.
-
Используйте скрытое поле
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>
-
Вставьте идентификатор позиции в атрибут name, вот так:
<input type="submit" value="Delete" name="delete-position.{{ position }} />
В функции просмотра вам нужно будет просмотреть все данные в
request.POST
и найти все элементы, которые начинаются сdelete-position
, а затем использовать нарезку.