所以我有一个像这样粗略结构的会话变量:
request.session['selected_courses'] = {
'2': {'num_spots_available': 3,
attendees = [ {'first_name': 'Jon', 'last_name': 'Kan'}, ... ]}
...
}
'selected_courses'下的每个键都是课程ID。
我需要从所选课程中删除与会者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
所以我尝试了request.session.modified属性(如上所示)和SESSION_SAVE_EVERY_REQUEST = True
,但都没有用。 (请注意:我还是Django的新手。)
答案 0 :(得分:2)
这段代码太复杂了,至少有一个严重的错误。 remove
不会返回修改后的列表,而是None
,因此,如果您执行attendees = attendees.remove(...)
,则与会者现在将为“无”。
编写此代码的一种非常简单的方法是使用循环:
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
搜索特定的课程ID,最好将其存储为由该ID键入的字典,而不是包含ID作为值的字典列表。
request.session['selected_courses'] = {
'2': [ {'first_name': 'Jon', 'last_name': 'Kan'}, ... ]
}