【问题标题】:Flask WTForms SelectMultipleField limit maximum number of selectionsFlask WTForms SelectMultipleField 限制最大选择数
【发布时间】:2018-03-08 10:37:32
【问题描述】:

现在我正在用 Flask 构建一个 webapp,包括一些 WTForms。其中之一是人们可以从多个选项中进行选择的清单(因此是 SelectMultipleField)。现在我想确保人们只能选择最大数量的选项(比如 3 个选项中的 2 个),如果他们想选择更多,首先必须取消选择其他选项之一。我认为它可能需要做一些验证,但我真的不确定如何做到这一点......非常感谢任何帮助! 这是来自 forms.py 的代码

class MultiCheckboxField(SelectMultipleField):
    option_widget = widgets.CheckboxInput()
    widget = widgets.ListWidget(prefix_label = False)

class ChecklisteForm(FlaskForm):
    list_of_files = ['politiek', 'economie', 'sport']
    files = [(x, x) for x in list_of_files]
    example = MultiCheckboxField('Label', choices=files)
    submit = SubmitField('Wijzigen')

这是我的 html 模板中的代码

<form action="" method = "post">
    {{ form.hidden_tag() }}
<div class="container-fluid">
  <div class="row">
     <div class="col-lg-12">
     <div class="col-lg-4">
     <div class="button-group">
        <span class="kiezen_informatie">
        <button type="button" class="btn btn-info btn-large dropdown-toggle" data-toggle="dropdown">Kies kategorie </span> <span class="caret"></span></button>
        <ul class="dropdown-menu text-center">
        <li><a href = "#">{{form.example(class = "list-unstyled")}}</a></li>
        <li><a href = "#"> {{form.submit(class = "btn btn-info")}}</a></li>
        </ul>
      </div>    
     </div>
    </div>
   </div>
  </div>

我认为这也可能与包含一些 javascript 有关?但如果有什么办法可以避免我会很高兴:)

【问题讨论】:

    标签: javascript python html flask flask-wtforms


    【解决方案1】:

    您当然可以使用一些 Javascript 在客户端对此进行验证,但您还希望在服务器端对此进行验证,以确保用户不会避免 Javascript 验证并提交他们不应该提交的数据。

    您可以在表单中定义自定义validate 方法:

    class ChecklisteForm(FlaskForm):                                                
        list_of_files = ['politiek', 'economie', 'sport']                           
        files = [(x, x) for x in list_of_files]                                     
        example = MultiCheckboxField('Label', choices=files)                        
        submit = SubmitField('Wijzigen')                                            
    
        def validate(self):                                                         
    
            rv = FlaskForm.validate(self)                                           
    
            if not rv:                                                              
                return False                                                        
    
            print(self.example.data)                                                
    
            if len(self.example.data) > 2:                                          
                self.example.errors.append('Please select no more than 2 items')    
                return False                                                        
    
            return True 
    

    在您的 HTML 模板中:

        {% for key in form.errors %}                                            
            {% for error in form.errors[key] %}                                 
                <span style="color: red;">[{{ error }}]</span>                  
            {% endfor %}                                                        
        {% endfor %}  
    

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 2011-07-28
      • 2012-11-13
      • 2012-08-23
      • 2018-04-05
      • 2022-08-17
      • 2019-10-12
      • 2021-10-07
      相关资源
      最近更新 更多