2016-10-04 15 views
0

私はいくつかの配列でelif文を使ってユーザー入力を実行しようとしています。目標は、入力が配列内にある場合に変数を値に設定することです。現在値はNoneのままです。私はこれが私の欠けていることばかげたことだと確信していますが、どんな助けも大歓迎です。Django - 変数が適切に設定されていません

views.py

def fit_guide(request): 
    if request.method == 'POST': 
     form = FitGuideSizingForm(request.POST) 
     chest = request.POST['chest'] 
     waist = request.POST['waist'] 
     hip = request.POST['hip'] 

     if form.is_valid(): 

      chest_size = None 

      if chest in chest_size_0(): 
       chest_size = 0 

      elif chest in chest_size_2(): 
       chest_size = 2 

      elif chest in chest_size_4(): 
       chest_size = 4 

      elif chest in chest_size_6(): 
       chest_size = 6 

      elif chest in chest_size_8(): 
       chest_size = 8 

      elif chest in chest_size_10(): 
       chest_size = 10 

      elif chest in chest_size_12(): 
       chest_size = 12 

      elif chest in chest_size_14(): 
       chest_size = 14 

      elif chest in chest_size_16(): 
       chest_size = 16 

      elif chest in chest_size_18(): 
       chest_size = 18 

      elif chest in chest_size_20(): 
       chest_size = 20 

      elif chest in chest_size_22(): 
       chest_size = 22 

      elif chest in chest_size_24(): 
       chest_size = 24 

      elif chest in chest_size_26(): 
       chest_size = 26 

      elif chest in chest_size_28(): 
       chest_size = 28 

      print(chest_size) 

    form = FitGuideSizingForm() 
    c = {} 
    c.update(csrf(request)) 
    c.update({'form': form}) 

    return render(request, 'main/fit_guide.html', c) 

forms.py

class FitGuideSizingForm(forms.Form): 
    chest = forms.DecimalField(min_value=29, max_value=60, required=True) 
    waist = forms.DecimalField(min_value=23, max_value=50, required=True) 
    hip = forms.DecimalField(min_value=34.5, max_value=58, required=True) 

    def __init__(self, *args, **kwargs): 
     super(FitGuideSizingForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.form_id = 'id-fitGuideForm' 
     self.helper.form_class = 'blueForms' 
     self.helper.form_method = 'post' 
     self.helper.form_action = 'submit_survey' 
     self.helper.add_input(Submit('submit', 'Get Fit Guide!')) 

size_arrays.py例

def chest_size_0(): 
    return [29, 29.1, 29.2, 29.3, 29.4, 29.5, 29.6, 29.7, 29.8, 29.9, 
      30, 30.1, 30.2, 30.3, 30.4, 30.5, 30.6, 30.7, 30.8, 30.9, 
      31, 31.1, 31.2, 31.3, 31.4, 31.5, 31.6, 31.7, 31.8, 31.9] 


def chest_size_2(): 
    return [32, 32.1, 32.2, 32.3, 32.4, 32.5, 32.6, 32.7, 32.8, 32.9, 
      33, 33.1, 33.2, 33.3, 33.4] 


def chest_size_4(): 
    return [33.5, 33.6, 33.7, 33.8, 33.9, 34, 34.1, 34.2, 34.3, 34.4] 


def chest_size_6(): 
    return [34.5, 34.6, 34.7, 34.8, 34.9, 35, 35.1, 35.2, 35.3, 35.4] 

etc 

etc 
+1

これらの 'chest_size_XX()'メソッドは何ですか?それらはどこに定義されていますか?彼らは何を返すのですか? –

+0

これらは私が作成した私のsize_arrays.pyに設定されています。メインの投稿を編集して1つの例を示します。 – Kerosive

+1

'render'ショートカットを使っているので、' c.update(crsf(request)) 'を行う必要はありません。これらの3行を 'c = {'form':form}'に単純化することができます。 – Alasdair

答えて

1

あなたはここではいくつかの問題を抱えています。

まず、request.POSTの値を直接使用しています。それらは常に文字列になります。フォームに指定された型の値を取得するには、form.cleaned_data dictを使用する必要があります。

第2に、フィールドは小数ですが、配列には浮動小数点数が含まれています。浮動小数点の不正確さのために、たとえば29.1decimal.Decimal("29.1")と同じではありません。一貫した型を使用する必要があります。おそらく十進数がここで最も適切です。

第3に、これは本当にそれを行う最良の方法ではありません。比較を使用する方がずっと簡単です:

if Decimal("29.0") <= chest < Decimal("32.0"): 
    ... 
elif Decimal("32.0") <= chest < Decimal("33.5"): 
    ... 

などです。

+0

まあ、何?これがフォームの目的です。 –

0

chestrequest.POSTから設定すると、文字列値が与えられます。それをfloatに変換するとうまくいくはずです。

関連する問題