基于表单和数据库值的Django计算

时间:2016-02-10 22:56:39

标签: python django

我用django1.9和python-3.4.4开始了这个项目。 我已经建立了一个应用程序来跟踪我的能源,水和天然气的消耗。我开始这个项目是为了更好地了解django和python。

我创建了一个表单,其中有两个字段。一个用于计数器类型,一个用于值。 现在我想从数据库中获取最新值并进行简单的计算。

Component

models.py

delta = value_db - value_form

forms.py

class Verbraucher(models.Model):
    Id = models.AutoField(primary_key=True)
    Typ = models.CharField(max_length=50)
    Nummer = models.CharField(max_length=50, unique=True)

def __str__(self):
    return format(self.Typ)


class Daten(models.Model):
    Daten_id = models.AutoField(primary_key=True)
    Verbraucher = models.ForeignKey(Verbraucher)
    Stand = models.DecimalField(max_digits=10, decimal_places=3)
    Verbrauch = models.DecimalField(max_digits=10, decimal_places=3)
    Zeitstempel = models.DateTimeField(auto_now=True, auto_now_add=False)
    Updatestempel = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self):
        return format(self.Zeitstempel)

views.py

class DatenForm(forms.ModelForm):
    class Meta:
        model = Daten
        fields = ['Verbraucher', 'Stand']

我尝试了各种各样的方法,但似乎都没有。 我希望有人有一个想法来帮助我! 非常感谢!

修改

它背后的整个想法是有一个本地网站,你有两个小领域的小形式。一个用于计数器类型,一个用于今天的价值。 之后我想从这个计数器的数据库中获取最新值并减去bot。然后应将计算值插入db。 我希望有帮助吗?!

EDIT2:

我玩了一点点,发现了一个错误。 如果我想进行计算,我明白了。 def dateneingabe(request): if request.method == "GET": form = DatenForm() return render(request, 'verbrauch/eingabe.html', {'form': form}) elif request.method == "POST": form = DatenForm(request.POST) model = Daten() if form.is_valid(): instance = form.save(commit=False) Stand_db = Daten.objects.lastest(Verbraucher) instance.Verbrauch = do_calc(Stand - Stand_db) instance.save() return HttpResponseRedirect('/') 奇怪的是我在模型文件中将两者都定义为小数... 这是代码(在form = DatenForm(request.POST)之后的views.py): unsupported operand type(s) for -: 'decimal.Decimal' and 'Daten'

2 个答案:

答案 0 :(得分:0)

首先,安排你的观点并不好,虽然它会起作用。经过验证的表单数据将位于form.cleaned_data字典中。这些数据将很好地转换为Python类型。 IntegerField,DecimalField和FloatField等字段分别将值转换为Python int,Decimal和float。

from yourapp.model import Daten

def dateneingabe(request):
    if request.method == "POST":
        form = DatenForm(request.POST)
        if form.is_valid():
            instance = form.save(commit=False)
            Stand_db = Daten.objects.lastest(Verbraucher)
            #you used Stand instead of instance.stand and since instance.stand is decimalfield is will be processed nicely 
            instance.Verbrauch = do_calc(instance.Stand - float(Stand_db))
            instance.save()
            return HttpResponseRedirect('/')
    else:
        form = DatenForm()
    return render(request, 'verbrauch/eingabe.html', {'form': form})

我希望它有所帮助

答案 1 :(得分:0)

非常感谢您的支持和想法! 我设法解决了我的问题:

  private SessionFactory buildSessionFactory() {
    try {
        System.out.println(hostname);
        System.out.println(username);
        System.out.println(password);
        // Create the SessionFactory from hibernate.cfg.xml
        return new Configuration()
                .addAnnotatedClass(DBUser.class)
                .addAnnotatedClass(DBTrustee.class)
                .addAnnotatedClass(DBTrusteeUser.class)
                .setProperty("hibernate.show_sql", "true")
                .setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver")
                .setProperty("connection.url", "jdbc:oracle:thin:@"+hostname)
                .setProperty("connection.username", username)
                .setProperty("connection.password", password)
                .setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect")
                .setProperty("hibernate.default_schema", "apps")
                .buildSessionFactory();
    } catch (Throwable ex) {
        // Make sure you log the exception, as it might be swallowed
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

Stand_db给出字典中所选计数器的最后十进制值。 要获得实际值,我必须从名称中分离密钥。 Stand_db2正在这样做。

最后我进行计算并保存记录。