【问题标题】:Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x000002523CE84E48>>": "Balance.user" must be a "User" instance无法分配“<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x000002523CE84E48>>”:“Balance.user”必须是“User”实例
【发布时间】:2020-06-09 17:41:39
【问题描述】:

我正在开发我的 django 网站的钱包余额方面。我想要一种情况,新用户在网站上注册后,他的钱包余额设置为“0”,但我的代码抛出了上述错误。请协助。

查看

@unauthenticated_user
def registration(request):

    form = CreateUserForm()
    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')

            group = Group.objects.get(name='customer')
            user.groups.add(group)
            Customer.objects.create(
                user=user,
                name=user.username,
            )

            instance = Balance(user=request.user, balance=10)
            instance.save()
            messages.success(request, 'Account was created for ' + username)

            return redirect('loginuser')

    context = {'form': form}
    return render(request, 'account/registration.html', context)

型号

class Balance(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    balance = models.IntegerField()

    def __str__(self):
        return str(self.user) if self.user else ''

追溯

Traceback (most recent call last):
  File "C:\Users\ienovo\Domination\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\ienovo\Domination\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\ienovo\Domination\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\ienovo\Domination\accounts\decorators.py", line 12, in wrapper_func
    return view_func(request, *args, **kwargs)
  File "C:\Users\ienovo\Domination\accounts\views.py", line 64, in registration
    instance = Balance(user=request.user, balance=10)
  File "C:\Users\ienovo\Domination\venv\lib\site-packages\django\db\models\base.py", line 482, in __init__
    _setattr(self, field.name, rel_obj)
  File "C:\Users\ienovo\Domination\venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 219, in __set__
    self.field.remote_field.model._meta.object_name,

Exception Type: ValueError at /registration/
Exception Value: Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x000002523CE84E48>>": "Balance.user" must be a "User" instance.

【问题讨论】:

  • 用户未登录,因此request.User 不是User 对象,因此您不能将其分配给您的Balance 对象。

标签: python django wallet


【解决方案1】:

您在registration() 视图中分配了错误的user

# in your views.py
instance = Balance(user=request.user, balance=10)

上面的代码引用了请求对象中的用户,在本例中是未经身份验证的用户django.contrib.auth.models.AnonymousUser。如果要引用新创建的用户,应该使用CreateUserForm刚刚创建的user对象:

instance = Balance(user=user, balance=10)

【讨论】:

  • 非常感谢这个“instance = Balance(user=user, balance=10)”对我有用。我明白了这个错误。再次感谢您。你让我开心。
猜你喜欢
  • 2015-01-05
  • 2020-05-28
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2018-06-03
相关资源
最近更新 更多