Джанго продолжает выдавать следующее, когда я пытаюсь сохранить добавление двух атрибутов объекта.
invalid literal for int() with base 10: ''
Представление:
def buy_pack(request, pack_name):
if request.method == 'POST':
form = CardForm(request.POST, request.user)
pack = Pack.objects.get(name=pack_name)
stripe_user = request.user.username
if form.is_valid():
token = request.POST['stripeToken']
charge = stripe.Charge.create(
amount=pack.cost,
currency="usd",
card=token,
description=stripe_user+"_"+pack.name,
)
datestring = charge.created
dt = datetime.datetime.fromtimestamp(float(datestring))
new_purchase = Purchase(user=request.user, date_time=dt, pack=pack, payment_id=charge.id, last_4_digits=charge.card.last4)
new_purchase.save()
user_profile = request.user.get_profile()
t = user_profile.videos_remaining + pack.videos_allowed
user_profile.videos_remaining = t
user_profile.save()
Рассматриваемые модели:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
name = models.CharField(max_length=50)
videos_remaining = models.IntegerField(default=1)
last_4_digits = models.IntegerField(max_length=4, blank=True)
stripe_id = models.CharField(max_length=255, blank=True)
def __unicode__(self):
return self.name
И:
class Pack(models.Model):
name = models.CharField(max_length=25)
videos_allowed = models.IntegerField()
cost = models.IntegerField()
def __unicode__(self):
return self.name
Трассировка:
Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/Jeff/Dropbox/xxxxx/Code/thankyouvid/../thankyouvid/main/views.py" in buy_pack
48. user_profile.save()
File "/Library/Python/2.7/site-packages/django/db/models/base.py" in save
460. self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/Library/Python/2.7/site-packages/django/db/models/base.py" in save_base
526. rows = manager.using(using).filter(pk=pk_val)._update(values)
File "/Library/Python/2.7/site-packages/django/db/models/query.py" in _update
491. return query.get_compiler(self.db).execute_sql(None)
File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql
869. cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql
725. sql, params = self.as_sql()
File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py" in as_sql
834. val = field.get_db_prep_save(val, connection=self.connection)
File "/Library/Python/2.7/site-packages/django/db/models/fields/subclassing.py" in inner
28. return func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/db/models/fields/subclassing.py" in inner
28. return func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/db/models/fields/__init__.py" in get_db_prep_save
276. return self.get_db_prep_value(value, connection=connection, prepared=False)
File "/Library/Python/2.7/site-packages/django/db/models/fields/subclassing.py" in inner
53. return func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/db/models/fields/subclassing.py" in inner
53. return func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/db/models/fields/__init__.py" in get_db_prep_value
271. value = self.get_prep_value(value)
File "/Library/Python/2.7/site-packages/django/db/models/fields/__init__.py" in get_prep_value
876. return int(value)
Exception Type: ValueError at /buy_pack/most/
Exception Value: invalid literal for int() with base 10: ''
Для справки: сохраненное значение для user_profile.videos_remaining равно 1, а сохраненное значение для pack.videos_allowed равно100. Я ожидаю, что он сложит два значения вместе и сохранит их как 101 в атрибуте объекта user_profile.videos_remaining.
Если вы можете оказать какую-либо помощь, я был бы очень признателен.
РЕДАКТИРОВАТЬ: Проблема закончилась тем, что я не передавал значение для целочисленного поля last_4_digits.Похоже, это происходит, если у вас есть integerField с blank = True и вы не отправляете значение для него.