django-POST请求中的更改列表

时间:2019-01-04 13:31:42

标签: html django post django-forms django-views

我有一个元组列表,并且想要根据已按下的按钮在其中删除或添加元组。添加管道的功能正常,但是我的问题是,由于某种原因,如果我单击按钮删除元组,列表会将时间重置为删除发生前的状态。

例如,我有一个列表:

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 %}

1 个答案:

答案 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   
    ...

我仍然建议不要使用可变的默认参数来实现此目的。如果需要在请求之间共享数据,则最好根据应用程序要求使用缓存或数据库,或者可能使用会话状态。