改进Flask中的视图功能

时间:2014-06-03 17:11:07

标签: python flask sqlalchemy flask-sqlalchemy

以下是我正在制作的网页示例。在这个例子中,我有两个选择字段,用于在按下提交按钮时过滤右侧的结果。

我使用if-elif-else解决问题的方法,但如果我有更多过滤器,我的代码将很难管理。在这种情况下,我有2个过滤器,这意味着4个distints查询要管理,如果我有4个过滤器,这意味着16个不同的查询。

你能否建议我采用更好的方法,而不是采用我的做法?

enter image description here

我的代码的基本要素:

模型

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())
    

1 个答案:

答案 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())