使用Django保存匿名用户模型

15

我有一个 Django 模型:

class Project(models.Model):
    user = models.ForeignKey(User)
    zipcode = models.CharField(max_length=5)
    module = models.ForeignKey(Module)

在我的views.py文件中:

def my_view(request):  
    ...
    project = Project.objects.create(
                  user=request.user,
                  product=product_instance,
                  ...
              )
    project.save()

我希望能够将用户保存为已认证的用户或者AnonymousUser(稍后可以更新)。然而,如果我没有登录,我会得到以下错误:

ValueError: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x1b498d0>": "Project.user" must be a "User" instance.
我猜Django不会保存AnonymousUser,因为它不是在User模型中定义的用户。我需要将匿名用户添加到User模型中吗?还是我漏掉了什么?任何帮助都非常感激。
2个回答

18

user字段是一个ForeignKey,这意味着它必须引用某个用户

按照定义,在Django中AnonymousUser表示没有用户:不存在AnonymousUserAAnonymousUserB。它们都是一样的:AnonymousUser

结论:你不能将AnonymousUser放入User ForeignKey中。


然而,解决您的问题相当简单:当User是匿名用户时,只需将该字段留空。为此,需要允许它:

user = models.ForeignKey(User, blank = True, null = True)

1
好的,太棒了。所以如果我在AnonymousUser上执行user=request.user,那么该字段将为空,并且不会引发任何异常? - Darwin Tech
1
由于您向字段提供了不适当的数据,因此将引发异常。只需执行 if request.user.is_authenticated(): project.user = request.user 即可。 - Thomas Orozco
我是否还需要添加 null-True,因为该字段不能为 null - Darwin Tech
1
@DarwinTech null = True 影响的是空值的存储方式,而不是是否可以存储。你可以添加它,但这里不会有任何变化。 - Thomas Orozco
@DarwinTech 是的,你说得对,抱歉我有点混淆了,加上它吧。一旦你这样做,South 就会接管迁移!:) - Thomas Orozco
显示剩余4条评论

0
你可以这样处理,其中,
user = None
if request.user.is_authenticated:
    user = request.user

project = Project.objects.create(
              user=user,
              product=product_instance,
              ...
          )

接下来在你的方法中使用“user”。当它是匿名用户时,它将为“none”。

不要忘记在你的项目模型中定义用户:

user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接