所以这就是我所做的,到目前为止它有效,但我不确定是否是最好的方法:
添加额外的模板链接行操作:
column_extra_row_actions = [TemplateLinkRowAction('row_actions.duplicate_row',gettext('Duplicate Record'))]
在 ModelView 中,我根据创建和编辑方法定义了一个 duplicate_view
@expose('/duplicate/',methods=('GET','POST'))
def duplicate_view(self):
return_url = get_redirect_target() or self.get_url('.index_view')
if not self.can_create:
return redirect(return_url)
id = get_mdict_item_or_list(request.args, 'id')
if id is None:
return redirect(return_url)
old_model = self.get_one(id)
if old_model is None:
flash(gettext('Record does not exist.'), 'error')
return redirect(return_url)
form = self.edit_form(obj=old_model)
if not hasattr(form, '_validated_ruleset') or not form._validated_ruleset:
self._validate_form_instance(ruleset=self._form_edit_rules, form=form)
if self.validate_form(form):
new_model = self.create_model(form)
if new_model:
flash(gettext('Record was successfully created'),'success')
if '_add_another' in request.form:
return redirect(request.url)
elif '_continue_editing' in request.form:
# if we have a valid model, try to go to the edit view
if new_model is not True:
url = self.get_url('.edit_view', id=self.get_pk_value(new_model), url=return_url)
else:
url = return_url
return redirect(url)
else:
# save button
return redirect(self.get_save_return_url(new_model, is_created=True))
template = 'admin/model/duplicate.html'
form_opts = FormOpts(widget_args=self.form_widget_args,
form_rules=self._form_edit_rules)
return self.render(template,
form=form,
form_opts=form_opts,
return_url=return_url)
然后在templates/admin/model/row_actions.html中添加新的动作模板(图标):
<!--> DUPLICATE ACTION </!-->
{% macro duplicate_row(action, row_id, row) %}
{{ link(action, get_url('.duplicate_view', id=row_id, url=return_url), 'fa fa-duplicate glyphicon glyphicon-duplicate') }}
{% endmacro %}
{% macro duplicate_row_popup(action, row_id, row) %}
{{ lib.add_modal_button(url=get_url('.duplicate_view', id=row_id, url=return_url, modal=True), title=action.title, content='<span class="fa fa-duplicate glyphicon glyphicon-duplicate"></span>') }}
{% endmacro %}
最后在templates/admin/model/duplicate.html中创建继承自create的重复页面模板:
{% extends 'admin/model/create.html' %}
{% block body %}
<h1> Duplicate View</h1>
{{super()}}
{% endblock %}