【问题标题】:Column formatters in Flask Admin interfaceFlask 管理界面中的列格式化程序
【发布时间】:2017-07-28 04:53:31
【问题描述】:

您好,我创建了一个 Flask 管理界面。在其中一个字段(列)中,我想包含一个超链接。

class workout(db.Model):
    equipment = db.Column(db.String(100))
    place = db.Column(db.String(100))
    image = db.Column(db.Text)

或在模板中使用 Jinja2 宏:

我必须创建一个应包含上述列的视图,并且我必须格式化视图中的图像列。

我真的不太确定如何为上述自定义类模型创建视图。

from flask_admin.model.template import macro

class WorkoutView(ModelView):

在 _macros.html 文件中。

{% macro render_image() %}
<a href="#" id="upload_widget_opener">Upload images</a>
<script src="https://widget.cloudinary.com/global/all.js" type="text/javascript"></script>  

<script type="text/javascript">  
  document.getElementById("upload_widget_opener").addEventListener("click", function() {
    cloudinary.openUploadWidget({ cloud_name: 'mycloudname', sources: [ 'local', 'url', 'camera', 'image_search', 
                 'facebook', 'dropbox', 'google_photos' ], upload_preset: 'myuploadpreset'}, 
      function(error, result) { console.log(error, result) });
  }, false);
</script>

{% endmacro %}

如果我运行 _macros.html 文件,这很好,我得到了预期的超链接。 问题:当我尝试从 _macros.html 文件导入宏时,我没有在格式化的列中获得超链接

我在 _macros.html 或 app.py 文件中的语法有什么问题吗?

【问题讨论】:

  • 请说明是什么问题
  • 为什么MyModelView继承自db
  • @SumanKalyan :我没有在图像列中获得超链接
  • @stamaimer : db 与 postgresql [sqlalchemy] 连接
  • 你想在列表页面上传图片还是编辑和创建Flask-Admin页面?乌云带给你的是什么?

标签: python flask macros jinja2 flask-admin


【解决方案1】:

我认为你在滥用 SQLAlchemy 和 Flask-Admin。 CustomModel 类从 SQLAlchemy 的 db.Model 继承,CustomModelView 类从 Flask-Admin 的 ModelView 继承,以控制该模型在 Flask-Admin 中的行为。您可以通过以下方式实现您的目的:

使用form_widget_argsid 属性添加到表单字段;

继承create.html & edit.html 以添加javascript。

class ExampleModelView(ModelView):

    # ...

    edit_template = "admin/edit.html"
    create_template = "admin/create.html"

    form_widget_args = {
        "image": {
            "id": "cloudinary"
        }
    }

    # ...

# template inherit. "edit.html" is same as "create.html" except the first line.

{% extends "admin/model/create.html" %}
{% block tail %}
    {{ super() }}
    <script src="https://widget.cloudinary.com/global/all.js" type="text/javascript"></script>
    <script type="text/javascript">
        # js code to upload image and return response
    </script>
{% endblock %}

【讨论】:

  • 我对上面的代码不太清楚。 class ExampleModelView(ModelView): # ... 如果我像这样创建一个 CustomModelview,我如何使用我必须在其上创建视图的 CustomClassModel?如何定义视图中只有一列必须被格式化?如何使用上面显示的 create.html 文件在视图中呈现更改?
  • 首先,答案中的代码仅格式化image字段,而左侧字段保持不变。对于第二条评论,您可以先创建一个 Flask-Admin 实例并在其上调用 add_view 方法:admin.add_view(ExampleModelView(ExampleModel, db.session))。对于模板文件,您可以在您的模板目录中创建一个名为admin 的目录,并将继承的create.htmledit.html 放入其中。
  • @KathiravanNatarajan 好的