2016-01-15 81 views
0

所以我有了一個粗略的結構是這樣一個會話變量:刪除會話變量的Django

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 

所以我試圖請求.session.modified屬性(如上所示)與SESSION_SAVE_EVERY_REQUEST = True一起工作。 (請注意:我對Django仍然很陌生)。

回答

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 

注意,這不是任何低效的,因爲你要mapremove電話是真的環本身。

或者,你可能會考慮不同的數據結構;如果你經常需要搜索selected_courses特定課程ID,倒不如將其存儲爲通過ID鍵的字典,而不是包含ID爲值類型的字典列表。

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

謝謝您的回答丹尼爾!是的,所以我嘗試了你的解決方案,但它仍然沒有刪除與會者。我會嘗試更改我的會話數據結構,並讓您知道它是否仍然無效。 –