Значение модели Django не является типичным, почему?

#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 значения.