django - изменить список в запросе POST - PullRequest
0 голосов
/ 04 января 2019

У меня есть список кортежей, и я хотел удалить или добавить в него кортежи в зависимости от того, какая кнопка была нажата. Добавление tubles работает нормально, но моя проблема в том, что по какой-то причине, если я нажимаю на кнопку, чтобы удалить кортеж, список сбрасывает время до состояния, предшествующего удалению.

Например, у меня есть список:

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

Если у вас есть еще вопросы, просто спросите:)

EDIT:

добавлен возврат на мой взгляд

мой шаблон:

{% 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 голосов
/ 05 января 2019

Использование изменяемого значения для аргумента по умолчанию в Python (список в данном случае) - это , как правило, не очень хорошая идея . Список создается один раз при определении функции, что означает, что любые изменения, которые вы вносите в нее, видны при последующих вызовах функций. Тем не менее, кажется, что это может быть предназначено в вашем случае.

Причина, по которой вы не видите изменения в списке, заключается в том, что назначение, которое вы делаете 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   
    ...

Я бы по-прежнему рекомендовал не использовать изменяемый аргумент по умолчанию для достижения этой цели. Если вам нужно обмениваться данными между запросами, вам лучше использовать кеш, базу данных или, возможно, состояние сеанса, в зависимости от требований вашего приложения.

...