2016-12-20 21 views
0

私は一連のフィルタとhtmlの選択ドロップダウンを使用して高度な検索を試みます。私は、ユーザーが検索したいさまざまなフィールドを選択して結果を得ることができるようにしたいと思います。下のviews.pyの 'query'に4つのフィールドのみが有効な場合、「検索」(つまり複雑なフィルタ)が動作するようになりますが、4つ以上のフィールドはすべてのフィルタフィールド値を満たすレコードがないため結果を返しません。私が知っていたことは起こるだろう。Flask-SQLAlchemy-詳細フィルタを使用して検索

私は " - すべての - "オプションを作成する方法を理解しようとしています。そのため、ユーザーは最も関心のある属性と無視するクエリを選択できます。 SQLAlchemyのを使用して

views.py(切り捨てバージョン-持たを検索するために、いくつかのより多くのフィールドを)

from flask import render_template, redirect, session, url_for, request, send_from_directory 
from sqlalchemy import or_, and_, select 
from flask.ext.security import login_required 
from datetime import datetime 
from RestorationPlantDB import app, db 
from RestorationPlantDB import SPECIES, SPInfo, SPRef, Role, User 

@app.route('/search_advanced', methods = ['GET', 'POST']) 
def search_advanced(): 
    if request.method == 'POST': 
     stratum = request.form.get('stratum') 
     origin = request.form.get('origin') 


     query = SPInfo.query.filter(and_(SPInfo.Stratum == stratum, 
             SPInfo.Origin == origin)) 

    return render_template('result_advancedsearch.html', year=datetime.now().year, query=query) 

return render_template('search_advanced.html', year=datetime.now().year) 

@app.route('/result_advancedsearch', methods = ['GET', 'POST']) 
def result_advancedsearch(): 

    return render_template('result_advancedsearch.html', year=datetime.now().year) 

search_advanced.html

{% extends "layout.html" %} 

{% block content %} 

<div class="container"> 

    <h1>Advanced Search</h1> 

    <form method="POST" action="search_advanced">   
      <div class="advanced"> 
       <!--Select species stratum--> 
       <label for="stratum"><p class="advanced">Lifeform</p></label> 
       <select name="stratum" id="stratum"> 
        <option value= ""> -- All -- </option> <!-- Need to figure out how to pass an all option--> 
        <option value="Graminoid">Graminoid</option> 
        <option value="Forb">Forb</option> 
        <option value="Subshrub">Sub-Shrub</option> 
        <option value="Shrub">Shrub</option> 
        <option value="Tree">Tree</option> 
        <option value="Vine">Vine</option> 
       </select> 
      </div> 

      <div class="advanced"> 
       <!--Select species origin--> 
       <label for="origin"><p class="advanced">Origin</p></label> 
       <select name="origin" id="origin"> 
        <option value=""> -- All -- </option> <!-- Need to figure out how to pass an all option--> 
        <option value="Native">Native</option> 
        <option value="Exotic">Exotic</option> 
       </select> 
      </div> 

</form> 
</div> 
{% endblock %} 

答えて

1

あなたは条件付きで使用可能なパラメータに基づいてクエリを構築することができます。基本的には、filter(),filter_by()などのクエリメソッドを必要な回数だけ適用することができ、SQLAlchemyはクエリの作成方法を理解します。

query = SPInfo.query 
if stratum: 
    query = query.filter(SPInfo.Stratum == stratum) 
if origin: 
    query = query.filter(SPInfo.Origin == origin) 
if elev: 
    query = query.filter(SPInfo.Elevation.contains(elev)) 

results = query.all() 

クリーンなコードの場合、これらのフィルタを適用する方法をテストし、上記を実行するためのループを使用する要素のリストを作成することをお勧めします。

+0

@ PJ Santoroありがとう!私はちょっと試してみる必要がありますが、私はちょうど簡単なテストをして、それが動作しているように見えます! – DazedAndConfusedNewby

+0

すばらしく、私は助けることができてうれしい! – abigperson

関連する問題