2012-12-18 84 views
21

我有一個從表單輸入存儲用戶和產品數據的Django模型:Django的存儲匿名用戶數據

def ProductSelection(request, template_name='product_selection.html'): 
    ... 
    if user.is_authenticated(): 
     user = request.user 
    else: 
     # deal with anonymous user info 
    project = Project.objects.create(
     user=user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"], 
    ) 

當然,這是罰款身份驗證的用戶,但我也希望能夠存儲匿名用戶項目,並且如果可能的話,在它們最終註冊和認證時將它們與用戶相關聯。

我的想法是創建名稱= some_variable(時間戳與隨機散列?)連接的匿名用戶,然後將該用戶名保存在會話數據中。如果我確保會話變量(如果存在)用於記錄該用戶的所有項目活動,那麼我應該能夠在註冊時使用用戶的真實憑證更新項目。

這是過於複雜和脆弱?我有沒有必要不必要地保存數千行數據?這個常見問題的最佳方法是什麼?

任何有關這方面的指導將不勝感激。

回答

16

您可以使用Django's session framework來存儲匿名用戶數據。

然後,您可以將字段添加到您的Project模型保持匿名用戶的session_key值,

project = Project.objects.create(
    user=request.user, # can be anonymous user 
    session=request.session.session_key, 
    product=form.cleaned_data["product"], 
    quantity=form.cleaned_data["product_quantity"]) 

或簡單地存儲所有項目實例將在會話中的數據

if user.is_authenticated(): 
    project = Project.objects.create(
     user=request.user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"]) 
else: 
    # deal with anonymous user info 
    request.session['project'] = { 
     "product": form.cleaned_data["product"], 
     "quantity": form.cleaned_Data["product_quantity"]} 

創建合適的用戶時,您可以稍後從會話中檢索數據。

+0

當我在過去遇到過類似的問題時,當你需要回到另一個方向時,問題就出現了。就像用戶可以擁有多個項目一樣,並且您需要做一些事情,比如看看哪些會話喜歡兩個特定的項目。 – JeffS

+0

就我而言,我希望將匿名用戶數據存儲在數據庫中,並通過會話將其與特定用戶相關聯。如果'user = request.user'返回一個匿名用戶對象,我不能在註冊後將這些信息綁定到用戶。 –

+1

在這種情況下,我的第一個示例應該這樣做:添加一個字段以保存'session_key'值,然後您可以稍後檢索所需的Project實例,並在匿名用戶停止匿名時將其與新用戶關聯:-) –

7

只是爲了澄清,下面的代碼是如何實現的在我的案件的解決方案:

 project = Project.objects.create(
      session=request.session.session_key, 
      # save all other fields 
      ... 
     ) 
     if request.user.is_authenticated(): 
      project.user = request.user 
     else: 
      # make a copy of the session key 
      # this is done because the session_key changes 
      # on login/ register 
      request.session['key_copy'] = request.session.session_key 
     project.save() 

在我的models.py:

class Project(models.Model): 
    user = models.ForeignKey(User, null=True, blank=True) 
    ... 

所以用戶字段可以爲空,在這種情況下,我們使用session_key來跟蹤事物。