【问题标题】:Readonly form field in edit view - Flask-Admin编辑视图中的只读表单字段 - Flask-Admin
【发布时间】:2018-12-06 23:37:01
【问题描述】:

我试图为 Flask-Admin 应用程序中的 edit 视图设置一个表单字段为readonly。按照this问题的答案,我知道如果我有这个

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

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

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-admin


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      form_create_rules = (
          'col1', 'col2', 'col3')
      form_edit_rules = (
          'col1', 'col2', 'col3', 'col4)
      
      form_widget_args = {
          'col4': {
              'disabled': True
          }
      }
      

      【讨论】:

      • col4 可以包含在创建规则中吗?在编辑模式下只读
      【解决方案3】:

      我会为此做一些解决方法。创建一个custom edit template 并将其添加到您的班级。您在 github 上的烧瓶存储库中找到的标准编辑模板 (standard edit template)

      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) }} 但它会渲染我的字段两次......但我的第一种方法有效。

      【讨论】:

        【解决方案4】:

        纯python解决方案可以使用管理员提供的on_form_prefill回调函数,它只在编辑视图中运行。在这种情况下,您不需要form_widget_args

        你可以有这样的东西来动态编辑表单,使该字段只读:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多