#django #django-models
#django #django-модели
Вопрос:
Я создаю простое приложение, приложение для вычислений. Пользователь выбирает параметры и на основе этих параметров приложение вычисляет необходимые данные.
Проблема в том, что я не могу редактировать числа до того, как они были сохранены в базе данных.
Как я могу этого добиться? Спасибо.
Я попытался выполнить вычисление в models.py , но мне нужно, когда я вызываю ‘def calculate()’ из views.py он выдает ошибку (не тип).
Models.py
class Video(models.Model):
sirina = models.IntegerField(null=True)
visina = models.IntegerField(null=True)
roletne = models.IntegerField(null=True)
okapnice = models.IntegerField(null=True)
materijal = models.IntegerField(null=True)
komore = models.IntegerField(null=True)
krila = models.IntegerField(null=True)
ks = models.IntegerField(default=True)
kv = models.IntegerField(editable=False, null=True)
ros = models.IntegerField(editable=False,blank=True, null=True)
rov = models.IntegerField(editable=False,blank=True, null=True)
proba = models.CharField(max_length=15,default='2')
briner = models.CharField(max_length=15,default='2'
def calculate(self):
return self.sirina self.visina
total = property(calculate)
def save(self,*args,**kwargs):
self.ks = self.calculate()
super(Video,self).save(*args, **kwargs)
Views.py
def showvideo(request):
form = VideoForm(request.POST)
if form.is_valid():
b = 5000
sirina = request.POST.get('sirina')
visina = request.POST.get('visina')
roletne = request.POST.get('roletne')
#smejanje = sirina 5000
s = sirina
#k = sirina
#b = k 20
print(s)
print(sirina)
if sirina == '100' and roletne =='100':
print(True)
a = Video() ##
a.save() ## From here it respond with error NoneType
##
else:
print(False)
**EDIT**
I have this error:
"unsupported operand type(s) for : 'NoneType' and 'NoneType'/
Traceback :
File "C:UsersNikolaDesktopDeskdjangobuildscripts-3.6final1calculatorviews.py" in showvideo
26. a.save()
File "C:UsersNikolaDesktopDeskdjangobuildscripts-3.6final1calculatormodels.py" in save
33. self.ks = self.total()
File "C:UsersNikolaDesktopDeskdjangobuildscripts-3.6final1calculatormodels.py" in calculate
28. return self.sirina self.visina
Exception Type: TypeError at /start/
Exception Value: unsupported operand type(s) for : 'NoneType' and 'NoneType'
####
Why is self.sirina and self.visina NoneType?
Комментарии:
1. это не потому, что оно не сохраняется, но когда вы это делаете
a = Video()
,sirina
иvisina
естьNone
, поэтому вы не можете сложить их вместе. Вы должны присвоить значенияa
перед вызовомsave()
, и в вашемcalculate()
методе вы должны сначала проверить, чтоsirina
иvisina
не являютсяNone
, и решить, что делать, если одно из значений являетсяNone
.2. Но они не должны быть None, потому что эти два поля являются входными данными?
3. из-за
a = Video()
4. Как я могу заставить это работать?
5. Может быть, изучить Python? На самом деле это урок 1 о том, как создавать экземпляры объектов из классов в Python.
Ответ №1:
Вместо a.save()
вы должны попробовать form.save()
. у вас есть все ваши данные в форме. Нет смысла создавать новый экземпляр Video
и сохранять его снова. Кроме того, вам следует либо избегать принятия нулевых значений в этих полях, либо обрабатывать нулевые условия в вашем calculate
методе.
Комментарии:
1. предполагая, что
VideoForm
этоModelForm
.2. Спасибо за ваш повтор
Ответ №2:
Вы определили sirina
и visina
как значения, которые могут быть None
:
sirina = models.IntegerField(null=True)
visina = models.IntegerField(null=True)
поэтому всякий раз, когда вы обращаетесь к этим атрибутам, вы должны быть осторожны в том, что с ними делать. Потому что, когда вы инициализируете Video
без этих значений, выполнив a = Video()
, они будут None
.
self.visina self.sirina
вызовет NoneType
ошибку, потому что вы не можете использовать
для None
значения.