2016-03-07 88 views
1

我有一個Flask應用程序,Flask-SQLAlchemyFlask-AdminFlask-Admin批量處理表格

我想執行一個批處理操作,但與窗體。例如,我想爲歸因的表單設置相同的文本值,但該值由用戶輸入。

我看到了documentation for batch actions,但它只有預定義數據的示例。

是否有可能,或者有一些解決方法呢?

回答

2

我實現這一目標的方法是在@action方法中執行內部POST。

class AddressView(AdminView): 

    # ... .... 

    @action('merge', 'Merge', 'Are you sure you want to merge selected addresses?') 
    def action_merge(self, ids): 

     if len(ids) < 2: 
      flash("Two or more addresses need to be selected before merging") 
      return 

     return_url = request.referrer 
     return redirect(url_for('mergeaddresses.index', return_url=return_url), code=307) 

然後定義兩條路線,一個用於內部交,然後一個接收從接收用戶的輸入數據的形式(MergeAddressForm在下面的情況下)提交POST。

在下面的例子中,我碰巧使用Flask-Admin BaseView來處理路由。請注意,flask-admin列表視圖中的原始已檢查標識是如何檢索的,然後作爲已編碼的逗號分隔列表隱藏字段存儲在表單中,並且同樣將return_url存儲回flask-admin列表視圖。

class MergeAddressesView(BaseView): 

    form_base_class = BaseForm 

    def __init__(self, name=None, category=None, 
       endpoint=None, url=None, 
       template='admin/index.html', 
       menu_class_name=None, 
       menu_icon_type=None, 
       menu_icon_value=None): 
     super(MergeAddressesView, self).__init__(name, 
              category, 
              endpoint, 
              url or '/admin', 
              'static', 
              menu_class_name=menu_class_name, 
              menu_icon_type=menu_icon_type, 
              menu_icon_value=menu_icon_value) 
     self._template = template 

    def is_visible(self): 
     return False 

    @expose('/', methods=['POST']) 
    def index(self): 
     if request.method == 'POST': 
      # get the original checked id's 
      ids = request.form.getlist('rowid') 

      merge_form = MergeAddressForm() 
      merge_form.process() 
      joined_ids = ','.join(ids) 
      encoded = base64.b64encode(joined_ids) 
      merge_form.ids.data = encoded 
      _return_url = request.args['return_url'] 
      merge_form.return_url.data = _return_url 
      self._template_args['form'] = merge_form 
      self._template_args['cancel_url'] = _return_url 
      return self.render(self._template) 

    @expose('/merge', methods=['POST']) 
    def merge(self): 

     if request.method == 'POST': 
      merge_form = MergeAddressForm(selection_choices=[]) 
      decoded = base64.b64decode(merge_form.ids.data) 
      ids = decoded.split(',') 
      # do the merging 
      address_merger = AddressMerger(ids=ids, primary_id=merge_form.primary_address.data) 
      address_merger.merge() 
      # return to the original flask-admin list view 
      return redirect(merge_form.return_url.data) 

我的用戶輸入表單模板如下所示。請注意動作網址。

{% extends 'admin/base.html' %} 
{% import "bootstrap/wtf.html" as wtf %} 

{% block body %} 
    <h3>{{ admin_view.name|title }}</h3> 
    <form role="form" action="{{ url_for('mergeaddresses.merge') }}" method="post" name="form"> 

     {{ form.hidden_tag() }} 

     {{ wtf.form_errors(form) }} 

     {{ wtf.form_field(form.primary_address) }} 

     <button type="submit" class="btn btn-primary">Merge</button> 
     <a href="{{ cancel_url }}" class="btn btn-danger" role="button">Cancel</a> 
    </form> 
{% endblock %}