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

Python 编辑视图中的只读表单字段-Flask Admin,python,flask,flask-sqlalchemy,flask-admin,Python,Flask,Flask Sqlalchemy,Flask Admin,我试图将一个表单字段设置为readonly,仅用于Flask Admin应用程序中的编辑视图。根据问题的答案,我知道如果我有这个 class MyView(ModelView): form_widget_args = { 'title': { 'readonly': True } } 我可以将表单字段设置为只读,但这同时应用于创建和编辑视图。如何仅将参数应用于“编辑”视图?我将为此做一些变通。创建并将其添加到类中。在git

我试图将一个表单字段设置为
readonly
,仅用于Flask Admin应用程序中的编辑视图。根据问题的答案,我知道如果我有这个

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

我可以将表单字段设置为
只读
,但这同时应用于创建和编辑视图。如何仅将参数应用于“编辑”视图?

我将为此做一些变通。创建并将其添加到类中。在github上的flask存储库中找到的标准编辑模板

并在自定义编辑模板中创建一个javascript函数,该函数禁用您的元素。因此,它仅在“编辑”视图中禁用,而不在“创建”视图中禁用

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

这也许不是最好的解决方案,但对我来说很有效。我认为还可以更改jinja2模板以直接禁用该文件。我试过:{form.myfield_id(disabled=True)}},但它会呈现我的字段两次。。。但是我的第一种方法是有效的。

纯python解决方案可以使用admin提供的
on\u form\u prefill
回调函数,它只在编辑视图中运行。在这种情况下,您不需要
表单\u widget\u args

您可以使用如下方式动态编辑表单,使该字段为只读:

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

另一种方法是使用和。在“创建”视图中显示只需要的字段,并添加要在“编辑”视图中显示的字段,使其为只读

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

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

我认为您可以通过在处理编辑的方法中检查您试图编辑的值来实现。 例如: 您正在尝试编辑id为1的值,然后可以在views py文件中检查该值并添加代码

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

col4可以包含在创建规则中吗?在编辑模式下只读
def editdata(id=None):
    if id:
        form.title.render_kw = {'readonly': True}
#rest of the code