以下是我正在制作的网页示例。在这个例子中,我有两个选择字段,用于在按下提交按钮时过滤右侧的结果。
我使用if-elif-else
解决问题的方法,但如果我有更多过滤器,我的代码将很难管理。在这种情况下,我有2个过滤器,这意味着4个distints查询要管理,如果我有4个过滤器,这意味着16个不同的查询。
你能否建议我采用更好的方法,而不是采用我的做法?
class StandardName(db.Model):
__tablename__ = 'std_names'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
standards = db.relationship('Standard', backref='stdname', lazy='dynamic')
class Standard(db.Model):
__tablename__ = 'standards'
id = db.Column(db.Integer, primary_key=True)
stdname_id = db.Column(db.Integer, db.ForeignKey('std_names.id'))
group = db.Column(db.String)
class StandardForm(Form):
standard = SelectField("Select the standard: ",
choices=[("All","All"),("mamp","mamp"), ("est","est"])
group = SelectField("Select the group: ",
choices=[('All','All'),('1','1'),('2','2'),('3','3')])
submit = SubmitField('Submit')
视图功能将根据选择字段显示查询结果。在这种情况下:
如果用户在标准和组字段中选择“全部”,则视图将执行Standard.query。
如果用户仅在标准字段中选择“全部”,则视图将仅过滤组列
如果用户仅在组字段中选择“全部”,则视图将仅过滤标准列
在thoses字段中选择另一个选项将用于过滤查询。
@app.route("/", methods=['GET', 'POST'])
def index():
form = StandardForm()
if form.standard.data == "All" and form.group.data == "All":
q = Standard.query
elif form.standard.data == "All":
q = Standard.query.filter(
Standard.group == form.group.data)
elif form.group.data == "All":
q = Standard.query.filter(
Standard.stdname.has(name=form.standard.data))
else:
q = Standard.query.filter(
Standard.stdname.has(name=form.standard.data),
Standard.group == form.group.data)
return render_template(
'index.html',
form=form,
standards=q.all())
答案 0 :(得分:0)
我提出了解决这个问题的更通用的形式。
@app.route("/", methods=['GET', 'POST'])
def index():
form = StandardForm()
std = form.data.get('standard')
group = form.data.get('group')
q = Standard.query
for fieldname, value in form.data.items():
if fieldname == 'standard' and value != "All":
q = q.filter(Standard.stdname.has(name=std))
elif fieldname == 'group' and value != "All":
q = q.filter(Standard.group == group)
return render_template(
'index.html',
form=form,
standards=q.all())