2012-12-18 57 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来跟踪事物。