Я хочу давать пользователям десять монет каждый раз, когда они заполняют одну форму
Я хочу давать пользователям десять монет каждый раз, когда они заполняют одну форму, поэтому я попробовал этот код выше и показал эту ошибку
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)