2016-01-15 4 views
0

Поэтому у меня есть переменной сессии, которая имеет шероховатую структуру, как это:Переменные сессии Удаление Django

request.session['selected_courses'] = { 
    '2': {'num_spots_available': 3, 
      attendees = [ {'first_name': 'Jon', 'last_name': 'Kan'}, ... ]} 
    ... 
} 

Каждый ключ под «selected_courses» является конечно идентификатор.

Мне нужно удалить участника i.e {'first_name': 'Jon', 'last_name': 'Kan'} из выбранного курса. Когда я пытаюсь это сделать, сеанс фактически не удаляет участника. Когда я пытаюсь удалить другого участника, предыдущий участник снова появляется на сессии, даже несмотря на то, что мой код удалил его раньше! Однако после повторного запуска этого кода он, наконец, удаляет участника из сеанса.

Мой код в views.py (я вытащить данные из POST, потому что я делаю запрос AJAX и знать данные не вводятся пользователем):

course_id = str(request.POST['course_id']) 
first_name = str(request.POST['first_name']) 
last_name = str(request.POST['last_name']) 
request.session['selected_courses'][str(course_id)]['attendees'] = [a for a in request.session['selected_courses'][str(course_id)]['attendees'] 
     if a['first_name'] != first_name or a['last_name'] != last_name] 

request.session.modified =True 

Так что я попробовал запрос .session.modified (как показано выше) вместе с SESSION_SAVE_EVERY_REQUEST = True и не работал. (Обратите внимание: я до сих пор совершенно новичок в Django).

ответ

2

Этот код является слишком сложным и содержит как минимум одну серьезную ошибку. remove не возвращает измененный список, но None, поэтому, если вы сделаете attendees = attendees.remove(...), то теперь участники будут None.

Очень много более простой способ, чтобы написать этот код будет с петлями:

for course in request.session['selected_courses']: 
    if course['course_id'] == course_id: 
     course['attendees'] = [ 
      a for a in course['attendees'] 
      if a['first_name'] != first_name and a['last_name'] != last_name 
     ] 
     break 

Заметим, что это не какой-либо менее эффективным, так как ваши звонки на map и remove действительно сами петли.

В качестве альтернативы вы можете рассмотреть другую структуру данных; если вам нужно регулярно искать selected_courses для конкретного идентификатора курса, лучше было бы хранить его в виде ключа, заданного этим идентификатором, а не списка идентификаторов, содержащих идентификатор в качестве значения.

request.session['selected_courses'] = { 
    '2': [ {'first_name': 'Jon', 'last_name': 'Kan'}, ... ] 
} 
+0

Спасибо за ваш ответ Daniel! Да, поэтому я попробовал ваше решение, но он все еще не удалял участника. Я попытаюсь изменить структуру данных сеанса и сообщить вам, если он все еще не работает. –

Смежные вопросы