2012-08-22 42 views
0

我有一個新初始化方法,它允許根據參數來顯示各種選擇的一種形式:驗證具有重載_init_形式

class Isochrone_Set_Parameters(forms.Form): 
    Grid_Choices = Grids_Selection.Grid_Choices 

    def __init__(self, Grid_Type, *args, **kwargs): 
     super(Isochrone_Set_Parameters, self).__init__(*args, **kwargs) 

     if Grid_Type == Grids_Selection.Grid_Values[0]: 
      Choices = (('0.0','0.0'),('0.1','0.1'),('0.3','0.3'),('0.5','0.5'),('0.6','0.6'),('0.7','0.7'), \ 
        ('0.8','0.8'),('0.9','0.9'),('0.95','0.95')) 
      self.fields['Rotation_Rate'] = forms.ChoiceField(choices=Choices) 
     elif Grid_Type == Grids_Selection.Grid_Values[1]: 
      Choices = (('0.0','0.0'),('0.568','0.568')) 
      self.fields['Rotation_Rate'] = forms.ChoiceField(choices=Choices) 
     else: 
      Choices = (('-1.0','-1.0'),('-2.0','-2.0')) 
      self.fields['Rotation_Rate'] = forms.ChoiceField(choices=Choices) 

     self.fields.keyOrder = [ 
      'Selected_Grid', 
      'Metallicity', 
      'Mass', 
      'Rotation_Rate'] 

    Selected_Grid = forms.ChoiceField(choices=Grid_Choices) 
    Metallicity = forms.FloatField() 
    Mass = forms.FloatField() 

和以下觀點:

def Isochrone(request): 
    if request.method == 'POST':# If the form has been submitted... 
     form = Isochrone_Set_Parameters(request.POST) # A form bound to the POST data 

     if form.is_valid(): 

      return HttpResponse("C'est ok") 

     else: 
      return render_to_response("Site/Isochrone.html",{       
          'form': form 
          },context_instance=RequestContext(request)) 
    else: 

     form = Isochrone_Set_Parameters(Grid_Type = "NotSet",initial={'Metallicity': -1.0, 'Mass': -1.0, 'Rotation_Rate': -1.0}) # An unbound form 

     return render_to_response("Site/Isochrone.html",{ 
         'form': form 
         },context_instance=RequestContext(request)) 

當表單發佈時,form.is_valid()測試失敗。我沒有錯誤消息,可以通過form.POST。[「My_Value」]訪問發佈的值。我不明白我做錯了什麼。有人可以給我一個關於如何糾正這個問題的提示嗎?

(我精確的錯誤似乎是鏈接到形式的init方法的重載,因爲如果我把一個簡單的ChoiceField爲Rotation_Rate,它完美的作品。)

謝謝!

回答

0

您已將簽名更改爲表單初始化,因此第一個參數現在是Grid_Type而不是通常的data。這意味着當你做form = Isochrone_Set_Parameters(request.POST)時,POST被用於Grid_Type

要麼確保你總是傳遞Grid_Type,或(最好)不要把在參數列表都:從kwargs得到它:

def __init__(self, *args, **kwargs): 
    Grid_Type = kwargs.pop('Grid_Type', None) 
    super(Isochrone_Set_Parameters, self).__init__(*args, **kwargs) 
    ... 

(另外,請使用PEP8標準的命名約定:IsochroneSetParameters,grid_type等)。

+0

好的,謝謝,我明白我的錯誤。爲了避免混淆,以防這個答案對其他人有用,上面有一個小錯誤:應該是'def __init __(self,* args,** kwargs):' – user1618164

+0

是的,很抱歉,編輯過。 –