37

我有一个 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"],
    )

当然这对于经过身份验证的用户来说很好,但我也希望能够存储匿名用户项目,并且如果可能的话,在他们最终注册和验证时将它们与用户相关联。

我的想法是创建 name = some_variable 的匿名用户(时间戳与随机哈希连接?),然后将该用户名保存在会话数据中。如果我确保该会话变量(如果存在)用于记录该用户的所有项目活动,我应该能够在用户注册时使用用户的真实凭据更新项目。

这是否过于复杂和脆弱?我是否冒着不必要地保存数千行数据的风险?这个常见问题的最佳方法是什么?

对此的任何指导将不胜感激。

4

2 回答 2

30

您可以使用Django 的会话框架来存储匿名用户数据。

然后,您可以在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"])

或者只是存储 Project 实例在会话中的所有数据

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"]}

您可以稍后在创建适当的用户时从会话中检索数据。

于 2012-12-18T18:50:35.807 回答
11

只是为了澄清,下面的代码是如何在我的案例中实现该解决方案:

        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 来跟踪事物。

于 2012-12-20T21:12:34.527 回答