【问题标题】:Persist WTForm QuerySelectField value after get request获取请求后保留 WTForm QuerySelectField 值
【发布时间】:2016-12-09 00:30:59
【问题描述】:

我正在寻找一种干净的方法来在选择给定的下拉选项时保留 WTFForm QuerySelectField 值。这个想法是根据从 QuerySelectField 下拉列表中选择的给定技术过滤项目列表。我采用的方法是向 /projects 发送一个获取请求,其中包含一个带有技术 id 的查询字符串,使用下拉菜单上的 on change 事件,即 /projects?id=5。 我的结构如下:

项目形式-

class ProjectForm(ProjectFormBase):
   title = StringField('Title', [validators.Length(min=4, max=25), validators.DataRequired()])
   technology = QuerySelectField('Technology', query_factory= connect.technology_choices,
                    get_pk=lambda a: a.id,
                    get_label=lambda a: a.name, allow_blank=True, blank_text=u'Select a technology...')

项目路线-

@app.route('/projects', methods=['GET', 'POST'])
def projects():
    list_of_projects = None
    form = ProjectForm(request.form)
    technology_id = request.args.get('id')
    if technology_id:
       list_of_projects = connect.project(technology_id)
    if request.method == 'GET':
        if list_of_projects:
            connect.close_connection()
            return render_template("projects.html", 
                                    list_of_projects = list_of_projects, form = form)
        else:
            return render_template("projects.html", form=form)

JS-

$('#technology').on('change', function () {
        var technology = $("#technology").value;
        window.location.href="/projects?id=" + technology_id;
        window.history.pushState('obj', 'newtitle', '/projects');
    });

总而言之,我正在寻找选择的下拉菜单值在更改事件之后保持不变。我也对完全不同的方法持开放态度,而不是也传递查询字符串值。

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

    如果我理解正确,您现在只需要在使用 GET arg id 设置请求页面时设置技术选择字段。这样的事情应该可以工作:

    @app.route('/projects', methods=['GET', 'POST'])
    def projects():
        form = ProjectForm(request.form)
    
        if request.method == 'GET':
            technology_id = request.args.get('id')
            # Set selected option on select field.
            form.technology.data = technology_id
            try:
                list_of_projects = connect.project(technology_id)
                connect.close_connection()
            except:
                list_of_projects = []
    
            return render_template("projects.html",
                                   list_of_projects=list_of_projects, form=form)
    

    我还建议删除一些代码以符合 Python 的 EAFP 设计原则。

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2016-08-18
      • 1970-01-01
      相关资源
      最近更新 更多