2017-06-20 13 views
2

フラスコアプリケーションのプログラミングを読み始めましたが、私はドロップダウンメニューを利用しようとしていましたが、これまでは運がありませんでした。私がしたいのは、ユーザーが最初のドロップダウンリストから食品のタイプを選択すると、データベースから対応するリストを取得し、ドロップダウンリストの2番目のセットを埋める必要があるということです。私はどのように選択が行われたらすぐに要求を送るようにするかわかりません。私は本当にここで何をすべきか理解していません。フラスコ動的依存ドロップダウンリスト

<body> 
 
    <div> 
 
    <form action="{{ url_for('test') }}" method="POST"> 
 
     <div> 
 
     <label>Food:</label> 
 
     <select id="food" name="food" width="600px"> 
 
     <option SELECTED value='0'>Choose your fav food</option> 
 
     {% for x in food %} 
 
      <option value= '{{ x }}'>{{x}}</option> 
 
     {% endfor %} 
 
     </select> 
 
     <!-- After a selection is made, i want it to go back to the database and fectch the results for the below drop box based on above selection --> 
 
     </div> 
 
     <div> 
 
     <label>Choose Kind of Food:</label> 
 
     <select id="foodChoice" name="foodChoice" width="600px"> 
 
     <option selected value='0'>Choose a kind</option> 
 
     {% for x in foodChoice %} 
 
      <option value= '{{ x }}'>{{x}}</option> 
 
     {% endfor %} 
 
     </select> 
 
     </div> 
 
     <div> 
 
     <input type="submit"> 
 
     </div> 
 
    </form> 
 
    </div>

app.html

@app.route('/', method = ['GET', 'POST']) 
def index(): 
    foodList = [ i.type for i in db.session.query(FoodType)] 
    return render_template('main.html', food=foodList) 

@app.route(/foodkind', method = ['GET', 'POST']) 
def foodkind(): 
     selection = request.form['foodChoice'] 
     foodKind = [ i.kind for i in db.session.query(FoodType).filter(FoodKind == selection)] 
     return render_template('main.html', foodChoice = foodKind) 

私は多くの質問を見ていると私はまだ私を助ける簡単な何かを発見していません。誰かが私のためにコードをデモすることができれば、私はそれを見て学ぶことができれば素晴らしいだろう。

答えて

1

ここでAjaxを使用して、あなたの食物の選択に応じて食品のリストを取得する必要があります。だからあなたのテンプレートで、あなたはこのようなものを含める必要があります。

<html> 
    <head> 

    <script src="https://code.jquery.com/jquery-3.2.1.min.js" 
     integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" 
     crossorigin="anonymous"> 
    </script> 

    <script> 
     $(document).ready(function() { 
     $('#foodkind').change(function() { 

      var foodkind = $('#foodkind').val(); 

      // Make Ajax Request and expect JSON-encoded data 
      $.getJSON(
      '/get_food' + '/' + foodkind, 
      function(data) { 

       // Remove old options 
       $('#food').find('option').remove();         

       // Add new items 
       $.each(data, function(key, val) { 
       var option_item = '<option value="' + val + '">' + val + '</option>' 
       $('#food').append(option_item); 
       }); 
      } 
     ); 
     }); 
     }); 
    </script> 
    </head> 

    <body> 
    <form> 
     {{ form.foodkind() }} 
     {{ form.food() }} 
    </form> 
    </body> 
</html> 

このコードは、JSONエンコードされたデータのための速記Ajaxリクエストを行います。このデータには、食品選択ボックスの値のリストが含まれています。

あなたはフラスコビューにエンドポイント /get_food/<foodkind>を追加する必要があります、これが機能するために

food = { 
    'fruit': ['apple', 'banana', 'cherry'], 
    'vegetables': ['onion', 'cucumber'],             
    'meat': ['sausage', 'beef'], 
} 


@app.route('/get_food/<foodkind>') 
def get_food(foodkind): 
    if foodkind not in food:                 
     return jsonify([]) 
    else:                      
     return jsonify(food[foodkind]) 
関連する問題