2012-03-14 31 views
1

我對Django和整個Web開發概念都很感興趣。我只學習了Java和C++,但是我在大學裏找到了一個作爲Web開發人員的工作。我目前正在嘗試實現一個表單 - (http://albedo.csrcdev.com/pages/submit)。在我的模型中,我有一個字段沒有顯示在我的表單上,稱爲反照率。反照率應該由sum(outgoing1,outgoing2,outgoing3)/ sum(incoming1,incoming2,incoming3)來計算。所以我的問題是,我如何以及在哪裏從數據庫中獲取這些變量,並將新的計算值分配給Albedo。Django窗體,從窗體計算一個新值並將其分配給模型

我的同事告訴我使用的ModelForm我的形式,並嘗試在views.py這樣做,但現在我坐在這裏被卡住,沒有頭緒,而且他剛剛離開的假期! :(

由於提前,

大衛

views.py

@login_requried 
def submit(request): 
if request.method =='POST': 
    form = DataEntryForm(request.POST) 
    model = DataEntry() 
    if form.is_valid(): 
     form.save() 
     return HttpResponseRedirect('/map/rebuild/')            


else:                       
    form = DataEntryForm()                   

return render_to_response(
     'pages/submit.html', { 'form': form }, 
     context_instance=RequestContext(request)) 
+0

你可以發表一些你的views.py代碼 – Mayank 2012-03-14 13:18:42

回答

3
form = DataEntryForm(request.POST) 
if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.albedo = do_calc(instance.whatever0, instance.whatever1) 
    instance.save() 
    return HttpResponseRedirect('/map/rebuild/') 

請注意,您不必手動實例model = DataEntry() - 如果DataEntryForm是一個ModelForm子類,當你調用.save()它會創建模型。

它很可能是封裝在一個DataEntry.update_albedo()方法什麼的計算是個好主意。你會說這就是instance.save()之前,而不是做在視圖本身的計算。

+0

謝謝,它的簡單和能夠完成任務,這可能是最好的辦法。 – dajee 2012-03-14 14:01:54

0

一個可能的解決方案是在presave signal更新領域採用這種方法。

  • 你在保存模型之前更新反照率字段。
  • 請記住,你可以做一個保存沒有承諾save(commit=False)。這將更新您的字段,而不會更改數據庫的提交。

餘後從django signals doc抽放樣品:

from django.db.models.signals import pre_save 
from django.dispatch import receiver 
from myapp.models import MyModel 

@receiver(pre_save, sender=MyModel) 
def my_handler(sender, **kwargs): 
    sender.Albedo = sender.outgoing1 + ... 
2

我將從ModelFormsave方法分配該值。

假設albedo是模型中的字段名稱,也:

Class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     exclude = ('albedo') 

    def calculate_albedo(outgoing1, outgoing2, outgoing3, incoming1, 
              incoming2, incoming3): 
     return sum([outgoing1, outgoing2, outgoing3])/sum([incoming1, 
         incoming2, incoming3]) 

    def save(self, commit=True): 
     form_data = self.cleaned_data 
     self.instance.someval1 = form_data['someval1'] 
     self.instance.someval2 = form_data['someval2'] 
     self.instance.someval3 = form_data['someval3'] 
     self.instance.albedo = self.calculate_albedo(
        form_data['outoing1'], form_data['outoing2'], 
        form_data['outoing3'], form_data['incoming1'], 
        form_data['incoming2'], form_data['incoming3']) 
     return super(MyModelForm, self).save(commit) 

另外,如果Albedo是不是一類的名字,你應該使用小寫。這是Pythonic convention

+0

可能想失去'self.instance.user.save()'塊... – AdamKG 2012-03-14 13:41:55

+0

啊,謝謝你的發現。爲響應 – bennylope 2012-03-14 13:56:08

相關問題