我想给用户每填写一个表格十个硬币
I want to give users ten coins each time they fill out one form
我想在用户每次填写一张表格时给他们十个硬币,所以我尝试了上面的代码并显示了这个错误
TypeError at /profile
unsupported operand type(s) for +=: 'DeferredAttribute' and 'int'
error in views.py in line += 10
models.py
class User(AbstractUser):
user_pic = models.ImageField(upload_to='img/',default="",null=True, blank=True)
coins = models.IntegerField(default=100)
def gives_user_coins_after_create(sender, instance, created, **kwargs):
if created:
profile = instance.User.profile
profile.coins += 10
profile.save()
views.py
@login_required(login_url='accounts/login/')
def profile(request):
# Gives the user 10 coins for fill up one form
profile = get_user_model()
profile.coins += 10
profile.save()
return render(request,'account/profile.html')
我尝试了很多代码但没有任何效果,请提供任何想法或帮助
如果上面显示的 User
模型是您的 AUTH_USER_MODEL
那么您真正需要的是
def give_coins(user, count):
user.coins = F('coins') + count
user.save(update_fields=('coins',))
user.refresh_from_db(fields=('coins',))
(使用 F()
来避免(某些)竞争条件);没有 .profile
您需要访问的内容。
然后您可以在例如你的 FormView
的 form_valid
:
class MoneyFormView(FormView):
# ...
def form_valid(self, request):
give_coins(request.user, 10)
return super().form_valid(request)
我想在用户每次填写一张表格时给他们十个硬币,所以我尝试了上面的代码并显示了这个错误
TypeError at /profile
unsupported operand type(s) for +=: 'DeferredAttribute' and 'int'
error in views.py in line += 10
models.py
class User(AbstractUser):
user_pic = models.ImageField(upload_to='img/',default="",null=True, blank=True)
coins = models.IntegerField(default=100)
def gives_user_coins_after_create(sender, instance, created, **kwargs):
if created:
profile = instance.User.profile
profile.coins += 10
profile.save()
views.py
@login_required(login_url='accounts/login/')
def profile(request):
# Gives the user 10 coins for fill up one form
profile = get_user_model()
profile.coins += 10
profile.save()
return render(request,'account/profile.html')
我尝试了很多代码但没有任何效果,请提供任何想法或帮助
如果上面显示的 User
模型是您的 AUTH_USER_MODEL
那么您真正需要的是
def give_coins(user, count):
user.coins = F('coins') + count
user.save(update_fields=('coins',))
user.refresh_from_db(fields=('coins',))
(使用 F()
来避免(某些)竞争条件);没有 .profile
您需要访问的内容。
然后您可以在例如你的 FormView
的 form_valid
:
class MoneyFormView(FormView):
# ...
def form_valid(self, request):
give_coins(request.user, 10)
return super().form_valid(request)