[Python WTForms]如何更新SelectMultiField的choices?

发布于 2022-08-29 22:37:00 字数 154 浏览 8 评论 0

有一个SelectField和一个SelectMultiField,业务需求基于SelectField的值来更新SelectMuliField的choices。

是否有办法能够在更新了SelectField之后post到server端?或者有其他的方法来更新choices?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

長街聽風 2022-09-05 22:37:00

我的做法不太优雅,但能满足你的需求。

#filename: forms.py

class ProductForm(Form):
    brands = SelectField(u'brands', 
        choices=[],
        coerce = int)
    ...

    def __init__(self, *args, **kwargs):
        super(ArticleForm, self).__init__(*args, **kwargs)
        self.brands.choices = [(b.id, b.name) for b in Brand.query.all()]

class ModelForm(Form):
    models = SelectMultipleField('models', 
        choices = [],
        option_widget = widgets.CheckboxInput(),
        widget = widgets.ListWidget(prefix_label = False))

views.py

# filename: views.py

@app.route('/edit')
def product_edit():
    form = ProductForm()
    if form.validate_on_submit():
        """ request.form是一个MultiDict,request.form['models']仅仅能得到models列表的第一个元素,此处使用request.form.getlist()来获取整个列表。
        """
        return render_template_string('{{data}}', request.form.getlist('models'))
    return render_template('product_edit.html',form = form)

# function for Ajax
@app.route('/getmodel/<int:id>')
def model(id):
    brand = Brand.query.get(id)
    form = ModelForm()
    if brand is not None and brand.models:
        form.models.choices = [(c.id, c.name) for c in brand.models]
        return render_template_string('{{ form.models(multiple=True) }}', form = form)
    return u'暂无型号'

the template product_edit.html

<div>{{ form.brands }}</div>
<div id="m"></div>
<script>
    $(function(){
        $("#brands").change(function(){
            id = $(this).val();
            url = "{{ url_for('model', id=0) }}".replace("/0","/"+id)
            $.get(url, function(result){
                $("#m").html(result);
            })
        })
    })
</script>
回忆凄美了谁 2022-09-05 22:37:00

不用Ajax就POST到Server端,重新赋值form.Filed.Choices,再转跳回来呗~

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文