gpt4 book ai didi

python - Flask-Admin 带有表单的批量操作

转载 作者:行者123 更新时间:2023-11-30 22:59:12 26 4
gpt4 key购买 nike

我有一个包含 Flask-SQLAlchemyFlask-AdminFlask 应用程序。

我想执行批处理操作,但使用表单。例如,我想为属性表单设置相同的文本值,但该值是由用户输入的。

我看到了documentation for batch actions ,但它仅包含预定义数据的示例。

这可能吗,或者也许有一些解决方法?

最佳答案

我实现此目的的方法是在 @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 ListView 中的原始检查 ID,然后将其作为编码的逗号分隔列表隐藏字段存储在表单中,同样将 return_url 返回到 Flask-admin ListView 。

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)

我的用户输入表单模板如下所示。记下操作 URL。

{% 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 %}

关于python - Flask-Admin 带有表单的批量操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35852255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com