我有一个元组列表,并且想要根据已按下的按钮在其中删除或添加元组。添加管道的功能正常,但是我的问题是,由于某种原因,如果我单击按钮删除元组,列表会将时间重置为删除发生前的状态。
例如,我有一个列表:
ctestformat = [('sung', 4, 15), ('ren', 3, 27), ('lexe', 4, 39)]
删除15号后,我得到:
ctestformat = [('ren', 3, 27), ('lexe', 4, 39)]
但是在收到另一个删除或添加POST请求后,列表将重置为第一个状态,就像什么都没有删除一样
这是我根据单击哪个按钮来添加和删除元组的视图:
def editorstart(request, ctestformat=[]):
if request.method == 'POST':
"""If clicked on create gap button, create a new gap and put it in ctestformat"""
if 'create_gap' in request.POST:
selectedgap = request.POST['sendgap']
startindex = int(request.POST['startpoint'])-13
ctestformat.append((selectedgap, len(selectedgap), startindex))
ctestformat.sort(key=operator.itemgetter(2))
"""if clicked on deletegap, delete the gap from ctestformat"""
elif 'deletegap' in request.POST:
deleteindex = request.POST['deletegap']
test = [t for t in ctestformat if t[2] != int(deleteindex)]
ctestformat = test
# This function doesnt change anything to ctestformat
modifiedtext = createmodifiedtext(ctestformat)
return render(request, 'editor_gapcreate.html', {"text": modifiedtext, 'ctestformat': ctestformat})
如果还有其他问题,请问:)
编辑:
在我看来增加了回报
我的模板:
{% extends "base_generic2.html" %}
{% block content %}
<form action="editorgapcreate" id=create method="POST">
<input type="hidden" name="sendgap" id="sendgap">
<input type="hidden" name="startpoint" id="startpoint">
<script src="../static/textselector.js"></script>
<div id="thetext" onmouseup="getSelectionText()">
<h1>{{ text|safe }}</h1>
</div>
{% csrf_token %}
<p></p>
<b>Your current selected gap:</b>
<p id="currentgap"></p>
<input type="hidden" name="text" id="text" value="{{ text }}">
<button type="submit" name="create_gap" id="gapcreate">Create gap</button>
</form>
{% endblock %}
答案 0 :(得分:1)
在Python(此例中为列表)的默认参数中使用可变值是not normally a good idea。定义函数后,该列表就会创建一次,这意味着您对其所做的任何更改都将在后续函数调用中显示。但是,看来这可能是针对您的情况。
之所以看不到列表更改,是因为您在滤除项目后进行的ctestformat = test
分配没有效果。您需要先对原始列表进行查找,然后再使用pop()
将其删除,以对原始列表进行更改而不是重新分配。例如:
elif 'deletegap' in request.POST:
deleteindex = request.POST['deletegap']
for i, t in enumerate(ctestformat):
if t[2] == int(deleteindex):
ctestformat.pop(i) # Modify original list
break
...
我仍然建议不要使用可变的默认参数来实现此目的。如果需要在请求之间共享数据,则最好根据应用程序要求使用缓存或数据库,或者可能使用会话状态。