2011-07-08 89 views
0

我有一個Django網站,基本上只是顯示一堆項目 從數據庫搜索,過濾等。該網站公開 訪問,沒有登錄或任何東西。我想要做的是用戶訪問該網站的第一個 ,提示他們選擇一個過濾器,然後 保存過濾器選項(在他們的機器上會更可取,會有一個 瀏覽器cookie在這裏工作?),以便每個未來他們訪問 網站時,會顯示該過濾器。在Django存儲訪問者的選擇

所以我這裏有兩個具體問題:

1)什麼是存儲自己選擇的最佳方式?

2)收集他們的選擇最好的方法是什麼?我設想這種行爲的方式是 是他們第一次訪問該網站, 他們提供了「彈出式」的種類,基本上要求 他們的過濾器的選擇,繼續到主網站頁面啓用它們的 過濾器選項。我遇到的問題是,他們選擇的篩選器 選擇更改將顯示在網站上的 的內容。一旦我有 有他們的過濾器選擇,是否有辦法避免重新加載整個頁面?

下面是類似彈出我試圖 創建一個像樣的例子:http://www.wizards.com/wpn/events/rules.aspx

感謝, -Alexei

回答

1

給予一個cookie的用戶肯定會工作。在網絡開發中,該技術被稱爲爲用戶創建'會話',以便每當他們從您的站點請求頁面時,該請求可以被識別爲該特定會話的一部分並相應地提供服務。

Django帶有一個出色且易於使用的會話框架。您應該閱讀文檔here,但我會總結您需要採取的步驟。

  1. 啓用Django會話中間件(這已經在默認的Django項目中完成了)。確保django.contrib.sessions.middleware.SessionMiddleware位於您設置文件中的MIDDLEWARE_CLASSES變量中。
  2. 選擇會話後端。數據庫會話可以很好地工作(如果稍後性能會成爲問題,請考慮使用Memcached提供存儲的緩存會話)。
  3. 設置符合您要求的適當SESSION_COOKIE_AGE。如果您希望用戶的選擇持續很長時間,您可以將此數字設置得非常高。

完成此操作後,傳遞到視圖中的request變量將具有session屬性。 session是一個可以像字典一樣用來存儲信息的對象。神奇的是,這些信息對於向您的網站發出請求的每個用戶都是唯一的。

這部分代碼演示瞭如何基於存儲在他們的會議之前選擇的用戶選擇返回內容:

def get_front_page_contents(request): 
    filter = request.session.get('filter_choice', False) 
    if filter: 
     # do the filtering 
     render_to_response(template_name, 
      {'filtered_content': content}, 
      RequestContext(request)) 
    else: 
     # the user has not made a choice so 
     # return a default result set or redirect 
     # to form that allows them to make a choice 

你的第二個問題是如何收集這樣的選擇擺在首位。這是一個使用多頁面加載的簡單解決方案。

  1. 初次請求主頁時,請檢查request.session是否有爲此用戶保存的選項。
    • 如果他們這樣做,渲染包含過濾內容的頁面(並完成)。
    • 如果沒有,重定向到他們可以選擇的表單。
  2. 在表單提交中,爲該用戶存儲request.session的選擇。返回他們想要的內容。

經過此過程後,當相同的用戶在以後的日期回到第一步時,將顯示他們所需的內容。

避免頁面重新加載是一個單獨的問題,但它很容易使用JavaScript和AJAX技術完成。你可能會想要提供一個包含javascript的最小頁面來提出內容請求。可以用完全相同的方式檢查這些AJAX請求,以檢查會話數據的存在。