编辑视图中的只读表单字段-Flask-Admin

时间:2018-06-28 01:40:52

标签: python flask flask-sqlalchemy flask-admin

我试图仅将Flask-Admin应用程序中的 edit 视图的表单字段设置为readonly。在回答this问题之后,我知道如果我有这个问题

class MyView(ModelView):
    form_widget_args = {
        'title': {
            'readonly': True
        }
    }

我可以将表单字段设置为readonly,但这同时应用于 create edit 视图。如何仅将参数应用于 edit 视图?

4 个答案:

答案 0 :(得分:4)

一个纯python解决方案可能使用了admin提供的on_form_prefill回调函数,并且仅在编辑视图中运行。在这种情况下,您不需要form_widget_args

您可能会有这样的内容来动态编辑表单,从而使该字段为只读:

class MyView(ModelView):
  def on_form_prefill(self, form, id):
    form.title.render_kw = {'readonly': True}

答案 1 :(得分:2)

我会为此做一些解决方法。创建一个custom edit template并将其添加到您的班级中。您可以在github (standard edit template)

上的flask存储库中找到标准编辑模板
class MyView(ModelView):
    edit_template = 'my_custom_edit_template.html'

然后在您的自定义编辑模板中创建一个禁用您的元素的javascript函数。因此,仅在编辑视图中将其禁用,而在创建视图中则不会。

{% block tail %}
    {{ super() }}
    {{ lib.form_js() }}
    <script>
    window.onload = function () {
        document.getElementById("myfield_id").disabled = true;
    }
    </script>
{% endblock %}

这可能不是最佳解决方案,但对我有用。我认为也可以更改jinja2模板以直接禁用该字段。我尝试过:{{form.myfield_id(disabled = True)}},但是它两次渲染了我的字段……但是我的第一种方法有效。

答案 2 :(得分:1)

另一种实现方法是使用form_edit_rulesform_create_rules。在创建视图中显示您只想要的字段,并添加要在编辑视图中显示的字段并将其设置为只读

form_create_rules = (
    'col1', 'col2', 'col3')
form_edit_rules = (
    'col1', 'col2', 'col3', 'col4)

form_widget_args = {
    'col4': {
        'disabled': True
    }
}

答案 3 :(得分:0)

我认为您可以通过在处理edit的方法中检查要编辑的值来做到这一点。 例如: 您正在尝试编辑ID为1的值,然后在views py文件中可以检查该值并添加代码。

def editdata(id=None):
    if id:
        form.title.render_kw = {'readonly': True}
#rest of the code