2013-08-30 37 views
0

我生成以下方式處理動態形式在Django提交表單

class MeasureForm(forms.Form): 
    def __init__(self,measure_id,*args,**kwrds): 
     super(MeasureForm,self).__init__(*args,**kwrds) 
     m = Measure.objects.get(pk=measure_id); 
     if (m): 
      self.fields["measure_id"] = forms.IntegerField(initial = m.id , widget=forms.HiddenInput()) 
      for mp in MeasureParameters.objects.filter(measure = m): 
       # get the NVL'ed copy of the parameter 
       p = mp.get_parameter_for_measure() 
       if not p.is_modifiable: 
        # the file has a constant value 
        if (p.values and p.default): # contant must have both values and default index 
         value_ = p.values[p.values.keys()[p.default-1]]; 
         self.fields[p.name] = forms.IntegerField(label = p.description , initial = value_); 
         self.fields[p.name].widget.attrs['readonly'] = True; 
        else: 
         raise Exception("Parameter set as unmodifiable but has no value. [measure: %s, parameter: %s, measureparameter %s]" 
             % (measure_id , p.id , mp.__unicode__())) 
       elif (p.values): 
        # convert hstore dict to list of tuples for the choices to read 
        values_ = [(v, k) for k, v in p.values.iteritems()]; 
        # set default if exists , else take the first item 
        default_ = values_[p.default-1][0] if p.default else values_[0][0] 
        self.fields[p.name] = forms.ChoiceField(label = p.description , choices = values_ , initial = default_) 
       else: 
        self.fields[p.name] = forms.IntegerField(label = p.description) 
       if (not p.is_visible): 
        self.fields[p.name].widget = forms.HiddenInput() 
     else: 
      raise Exception ("Could not find measure. [measure %s]" % (measure_id)); 

基於元數據的形式,這是我的看法

def index(request,measure_id = None): 

    owners = Owner.objects.all()  
    form = None 
    result = None 
    title = None 

    # handle the form 
    if request.method == 'POST': # the form has been submitted 
     form = MeasureForm(request.POST) 
     if form.is_valid(): # All validation rules pass  
      result = 100; 
    else: 
     if (measure_id): 
      title = Measure.objects.get(pk=measure_id).name; 
      # make an unbound form 
      form = MeasureForm(measure_id) 

    return render(request, 'calc/index.html' , 
      {'owners' : owners, 
      'form' : form , 
      'title' : title , 
      'result' : result}) 

我跟着this教程。 當我將問題提交回索引視圖時,我遇到了問題。我得到以下錯誤

int() argument must be a string or a number, not 'QueryDict' 

我可以在它的失敗在這行

m = Measure.objects.get(pk=measure_id); 

所以我環顧四周,發現this post轉儲看到的。我試圖調用改變形式這樣

form = MeasureForm(request.POST, measure_id = request.POST.get('measure_id')) 

,我得到了以下錯誤

__init__() got multiple values for keyword argument 'measure_id' 

我的第一個問題是 - 爲什麼是Django的再次執行初始化。一個表單對象已經被創建 - 這些字段只需要從發佈數據中綁定。

其次,我該如何克服這一點?

** django新手。謝謝。

回答

0

移除init方法measure_id,而使用kwrds['measure_id']裏面檢索它,然後適當地使用它們的關鍵字參數:

MeasureForm(request.POST, measure_id=measure_id) 
MeasureForm(measure_id=measure_id) 
+0

我得到一個'KeyError'上'measure_id'此行'measure_id = kwrds ['measure_id']'在第一次調用時從索引視圖'form = MeasureForm(measure_id)'。 – haki

+0

@haki使用像這樣的關鍵字參數'form = MeasureForm(measure_id = measure_id)' – mariodev

+0

謝謝你。它現在正在工作。首先,我得到了'__init __()得到了一個意外的關鍵字參數'measure_id'',所以我改變了超級初始化以使得沒有參數'super(MeasureForm,self).__ init __()'。 – haki