天道酬勤,学无止境

如何自定义flask admin QuerySelectMultipleField 选择?(How to customize flask admin QuerySelectMultipleField choice?)

问题

我正在使用flask_admin来允许管理员用户访问数据库,其中存在一对多关系。 编辑条目时,我希望下拉菜单仅显示满足条件的选项。 我虽然query_factory可以做到这一点。 以下是我现在拥有的最小示例:

class OneSideObj(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    active = db.Column(db.Boolean)
    many_side_obj_id = db.Column(
        db.Integer,
        db.ForeignKey('many_side_obj.id')
    )

class ManySideObj(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    one_side_objs = db.relationship(
        'OneSideObj',
        backref = 'many_side_obj',
        lazy = 'dynamic',
    )

def get_manysideobj_id(*args):
    ##################
    # how to get id? #
    ##################
    return id

class ManySideObjView(ModelView):
    id = get_manysideobj_id(*some_args) # <--- get current many_side_obj id

    form_args = {
        'one_side_objs': {
            'query_factory': lambda: query_filter(id)
        }
    }

def query_filter(id):
    return OneSideObj.query.filter(
        (OneSideObj.many_side_obj_id == id) | (OneSideObj.active == False)
    )

我希望该字段显示的查询都是非活动的OneSideObj ,或者是活动的但具有匹配的many_side_obj_id 。 我坚持获取当前模型实例 ID。 这似乎是一项简单的任务,但我找不到方法。 或者也许这种方法不可行?

回答1

经过数小时的尝试/错误和谷歌搜索,似乎这几乎是我想要做的。 这个问题归结为一个事实,即edit_form时不会被调用ModelView启动。 因此我相信没有直接的方法可以访问正在编辑的模型实例。 解决方法是覆盖edit_form并劫持传递模型实例的obj变量。 这是对我有用的代码(基于最小化的示例)

class ManySideObjView(ModelView):

    # model instance is passed to edit_form as obj
    def edit_form(self, obj):
        return self._filtered(
            super(ManySideObjView, self).edit_form(obj), obj.id
        )

    # save id in self._instance_id and access it from _get_list
    def _filtered(self, form, id):
        self._instance_id = id
        form.one_side_objs.query_factory = self._get_list
        return form

    # actual query logic
    def _get_list(self):
        id = self._instance_id

        return self.session.query(OneSideObj).filter(
            (OneSideObj.active == False) | (OneSideObj.many_side_obj_id == id)
        )
回答2

您是对的,模型实例在query_factory不可用,但实际上没有必要将函数传递给该字段。 您可以改为只创建一个查询并将其直接传递给表单。 这避免了实例变量,并且可以在单个方法中完成。

class ManySideObjView(ModelView):
    def edit_form(self, obj):
        form = super(ManySideObjView, self).edit_form(obj)

        query = self.session.query(OneSideObj).filter(
                    (OneSideObj.active == False) | (OneSideObj.many_side_obj_id == obj.id))

        form.one_side_objs.query = query
        return form

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to customize flask admin QuerySelectMultipleField choice?
    I am using flask_admin to allow admin user to access database, where one-to-many relationship is presented. When editing an entry, I would like the dropdown menu to show only the options that meet the condition. I though query_factory can do this. The following is minimal example of what I have now: class OneSideObj(db.Model): id = db.Column(db.Integer, primary_key=True) active = db.Column(db.Boolean) many_side_obj_id = db.Column( db.Integer, db.ForeignKey('many_side_obj.id') ) class ManySideObj(db.Model): id = db.Column(db.Integer, primary_key=True) one_side_objs = db.relationship(
  • Flask/flask-admin 中的 Select2 字段实现(Select2 field implementation in flask/flask-admin)
    问题 我正在尝试在我的一个 Flask 视图中实现 Select2 字段。 基本上,我希望在我的烧瓶应用程序视图(不是烧瓶管理模型视图)中使用与 Flask-admin 模型创建视图中相同的 select2 字段。 目前我的解决方案已经QuerySelectField从wtforms看起来是这样的 class TestForm(Form): name= QuerySelectField(query_factory=lambda: models.User.query.all()) 这允许我加载和选择我需要的所有数据,但它不提供 select2 搜索框等。目前我发现的只是来自 flask/admin/form/fields 和 flask/admin/form/widgets 的Select2Field和Select2Widget就像在这篇文章中一样 https://stackoverflow.com/questions/24644960/how-to-steal-flask-admin-tag-form-field 以及 http://ivaynberg.github.io/select2/ 上的 select2 文档和我一样了解这些可以重复使用,这意味着不需要其他自定义小部件、自定义字段。 如果有人可以提供有关在flask 应用程序中实现select2 字段的更多信息(包括视图
  • 在flask-admin 中使用下拉菜单限制选择(limit choices with dropdown in flask-admin)
    问题 我的 SQLAlchemy 模型有一个String字段,我想将其限制为几个选择。 我想知道如何在 Flask-Admin 界面中为这个字段创建一个下拉列表,以确保数据库只填充我的选择之一。 如果我让用户手动输入这些字段,他们可能会拼写错误等。 回答1 enum , form_choices和form_args 您的问题是关于在表单级别限制值,但我们也可以在架构级别简要讨论它。 A. 在数据库级别限制值: enum字段 要限制允许值的范围,首先要考虑的是您是否希望数据库为您强制执行。 大多数数据库都有一个enum类型字段,允许您将字段限制为一组值(MySQL、PostGres)。 这种方法有利也有弊。 在缺点中,值可能没有按照您期望的顺序列出; 并且每次要向集合引入新值时,都必须修改数据库。 B. 使用下拉菜单限制值: form_choices 要创建显示一组允许值的下拉列表,请创建一个自定义的form_choices并在form_choices定义您的值范围。 例如: class FilmAdmin(sqla.ModelView): form_choices = { 'now_showing': [ ('0', 'Not Showing'), ('1', 'Showing')], 'color': [('bw', 'Black & White'), ('color',
  • Flask-Admin 自定义日期时间视图(Flask-Admin customize datetime view)
    问题 使用flask-admin 时,日期时间字段的列表视图是这样的:“2014-02-22 13:30:43”。 我想知道是否可以为这样的内容更改此默认视图:“2014-02-22”或“2014-02-22 13:30”。 谢谢 回答1 是的,您可以设置column_type_formatters来定义默认格式。 此外,您可以将column_formatters设置为仅对列表视图中的一列使用自定义格式。 https://flask-admin.readthedocs.org/en/latest/api/mod_model/#flask.ext.admin.model.BaseModelView.column_formatters https://flask-admin.readthedocs.org/en/latest/api/ mod_model/#flask.ext.admin.model.BaseModelView.column_type_formatters 回答2 from flask_admin.model import typefmt from datetime import date def date_format(view, value): return value.strftime('%Y-%m-%d') MY_DEFAULT_FORMATTERS =
  • 如何使用flask-admin编辑模型视图(how to use flask-admin for editing modelview)
    问题 如何从flask-admin的编辑页面使用generate_password_hash设置password_hash 我在 python shell 中创建了一个用户名和密码。 密码正在散列 admin.add_view(MyModelView(User, db.session) - 让我编辑用户类模型当我编辑密码并提交但密码以纯文本格式保存时。 如何从flask-admin编辑密码,密码应以散列类型保存 我的代码是: from werkzeug.security import generate_password_hash, check_password_hash class User(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120)) password_hash = db.Column(db.String(64)) username = db.Column(db.String(64), unique=True, index=True) @password.setter def password(self, password): self.password_hash = generate_password_hash(password) def _
  • 如何在python-flask中添加自定义字体?(How to add custom font in python-flask?)
    问题 我试过使用@fontface css 样式,但字体没有被渲染。 有没有其他方法可以使用 python/flask 做到这一点? <!DOCTYPE html> <html> <style type="text/css"> @font-face { font-family: trial; src: url_for('CENTRALESANSCND-BOLD.otf') ; font-weight:bold; } </style> <body> <p style="font-family:trial; font-weight: bold"> Hello </p> </body> </html> 以上是我的 HTML 模板。 不幸的是,当我使用 Flask 渲染它时,它没有反映字体。 以下是我的 .py 代码: from flask import Flask, render_template app=Flask(__name__) app.secret_key='1234' @app.route('/', methods=['post', 'get']) def output(): c=2+3 print c return render_template('f.html', c=c) if __name__=='__main__': app.run(port=9876) 回答1
  • 如何使用 BasicAuth 保护自定义端点?(How to protect custom endpoints using BasicAuth?)
    问题 假设我使用 BasicAuth 启用了对资源的身份验证: class MyBasicAuth(BasicAuth): def check_auth(self,username,password,allowed_roles,resource,method): return username == 'secretusername' and password == 'secretpass' 我还有用于从 HTML 视图管理文档的自定义路由。 如何使用相同的 MyBasicAuth 来保护所有自定义路由? 我还需要实现使用上述 MyBasicAuth 进行身份验证的逻辑。 请帮我解决一下这个。 这是供个人使用的,所以我更喜欢硬编码用户名和密码。 回答1 您可以利用 Eve 本身在内部使用的requires_auth装饰器。 这样,您的身份验证类也将用于保护您的自定义路由: from eve import Eve from eve.auth import requires_auth app = Eve() @app.route('/hello') @requires_auth('resource') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() 回答2
  • 如何将自定义参数添加到 Python 日志格式化程序中?(How to add custom parameter into Python logging formatter?)
    问题 我正在使用带有 Flask 框架的标准 Python 日志记录模块。 我想将带有自定义参数的用户操作的所有记录的日志写入文件 - %(username)s to logging.Formatter: admin - 2013-10-11 15:11:47,033 action0 user1 - 2013-10-11 15:11:48,033 action1 user2 - 2013-10-11 15:11:49,033 action2 admin - 2013-10-11 15:11:50,033 action3 我正在使用 RotatingFileHandler: def get_user_name(): return session.get("username", "") file_handler = RotatingFileHandler(fname, maxBytes=1 * 1024 * 1024, backupCount=5) file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(logging.Formatter( '%(username)s - %(asctime)s %(levelname)-10s %(message)s [in %(pathname)s:%(lineno)d]' ))
  • Django 1.3或更低版本上Django Admin中的自定义过滤器(Custom Filter in Django Admin on Django 1.3 or below)
    问题 如何向django admin(模型仪表板右侧显示的过滤器)添加自定义过滤器? 我知道很容易包含基于该模型字段的过滤器,但是像这样的“计算”字段呢: class NewsItem(models.Model): headline = models.CharField(max_length=4096, blank=False) byline_1 = models.CharField(max_length=4096, blank=True) dateline = models.DateTimeField(help_text=_("date/time that appears on article")) body_copy = models.TextField(blank=False) when_to_publish = models.DateTimeField(verbose_name="When to publish", blank=True, null=True) # HOW CAN I HAVE "is_live" as part of the admin filter? It's a calculated state!! def is_live(self): if self.when_to_publish is not None: if ( self.when_to
  • 如何自定义 Flask-security 提供的注册?(How to customize registration provided by Flask-security?)
    问题 如果需要将用户角色设置为例如FooUser怎么FooUser ? 我需要在哪里做这个? 在我自己的/create_account视图中还是在上下文处理器中? @app.route('/create_account') def create_account(): user_datastore.find_or_create_role('FooUser') user_datastore.add_role_to_user(user,role) return render_template('register_user.html') 回答1 您可以按照以下说明自定义视图:http://flask-security.readthedocs.org/en/latest/customizing.html 您可以使用信号挂钩用户注册过程:http://flask-security.readthedocs.org/en/latest/api.html#signals 回答2 重要的! 第二种方法很简单。 @user_registered.connect_via(app) def user_registered_sighandler(sender, **extra): sender.logger.debug("logger-user_registered_sighandler:", extra)
  • 麦子学院python百度云_麦子学院python
    之前群里面很多人找我要,虽然网上有,但是网上的不齐全,我这里已经更新同步官网,如果官网更新我还会继续给大家更新,视频也有讲安全知识。大体上来说讲得还过得去。 游客,如果您要查看本帖隐藏内容请回复 第一阶段:python基础准备:Web前端开发之HTML+CSS基础入门: 课程章节 1.课程介绍 2.html的语法 3.html的基本结构 4.html的文档设置标记上(格式标记) 5.html的文档设置标记下(文本标记) 6.html图像标记img 7.html超链接的使用 8.html表格相关的标记 9.html表格实战《简单的网页布局》 10.html框架详解与框架布局实战 11.HTML表单设计(上) 12.HTML表单设计(下) 13.使用CSS样式的方式 14.定义CSS样式(CSS选择器) 15.CSS常用属性(颜色属性) 16.css常用属性(字体相关属性) 17.css常用属性(背景相关属性) 18.css常用属性(文本属性) 19.css常见属性(边框属性) 20.css常见属性(列表属性) 21.Div+Css布局(div+span以及盒模型) 22.Div+Css布局(布局相关的属性) 23.Div+Css布局(浮动以及溢出处理) 24.IE兼容测试工具与高效开发工具 25.实战项目(从效果图到网页布局以及按需切图) 26.实战项目(网页头部及搜索框的制作)
  • 如何使用flask-security在登录时运行自定义代码(How to run custom code at login with flask-security)
    问题 我是flask 的新手,但对python 相当精通 - 我有一个flask 应用程序,它使用flask-security 进行用户身份验证。 我想为用户登录过程添加一些额外的功能。 具体来说,我需要在用户登录时将其 auth_token(我已将其设置为一次性使用令牌)保存到数据库中,并在他们注销时将其删除。 问题出现是因为烧瓶安全性(据我所知)没有直接向开发人员公开登录机制。 据我所知,它导入了使用 login_user 函数的flask-login。 我开始尝试通过导入flask.ext.login(通常我不需要这样做)并重新定义函数来覆盖这个函数,如下所示: import flask.ext.login as a def new_login_user(): ...copy of existing function goes here... ...Plus new stuff with current_user.get_auth_token()... a.login_user = new_login_user 但是,我遇到了各种命名空间问题,这似乎是一种非常丑陋的方法。 我在想可能有一种方法可以用装饰器来做到这一点,但我是烧瓶的新手,无论如何都没有使用过装饰器。 有关解决此问题的最佳方法的任何想法? 对于上下文,我想要数据库中的 auth_token
  • flask框架基础
    文章目录 简介对比扩展包安装基操配置参数路由参数 视图获取参数保存文件返回信息cookiesession请求钩子扩展命令行 模板变量过滤器xss自定义过滤器表单宏 模型数据库模型类查询案例数据库迁移 发送邮件蓝图使用蓝图包 单元测试断言unittest测试模式 部署nginx 小结 简介 之前学习了Django框架,确实很沉,但也对web开发有了更进一步的认识,这里对比学习flask框架,大部分是理论,后面会总结一个自己跟过的项目客户端不一定是浏览器,也可以是PC软件、手机APP、爬虫程序Web框架的核心是:实现路由和视图;即根据客户端的不同请求执行不同的逻辑形成要返回的数据重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件(例如操作数据库),如Django 耦合关系严密,不适合改动扩展,但是开发快速 轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如Flask、TornadoFlask是用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展 比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL其 WSGI 工具箱采用 Werkzeug(路由模块)
  • python之flask框架详解
    目录 前言 1、新建文件helloworld.py 2、相关配置参数 3.加载配置文件 3.1配置对象加载 3.2配置文件加载 3.3读取配置 4 路由定义 4.1指定路由地址 4.2 给路由传参 4.3指定请求方式 4.4 正则匹配路由 5.简单视图 5.1 返回json 5.2重定向 5.3自定义状态码 6、异常捕获 6.1 HTTP主动抛出异常 6.2捕获错误 7、勾子函数 8. request请求参数 9、flask上下文参数 10.cookie使用 11、Session使用 12、蓝图Blueprint 运行机制 蓝图的url前缀 注册静态路由 设置模版目录 13、Flask-Script 扩展 前言 Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展,都需要用第三方的扩展来实现,比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。 其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。 Flask常用扩展包: Flask-SQLalchemy:操作数据库;Flask-script:插入脚本;Flask-migrate:管理迁移数据库;Flask-Session:Session存储方式指定
  • 使用自定义JSON编码器进行SQLAlchemy的PostgreSQL JSONB实现(Using a custom JSON encoder for SQLAlchemy's PostgreSQL JSONB implementation)
    问题 我正在使用SQLAlchemy的核心库来访问某些PostgreSQL数据库。 考虑一下我有下表: create table foo (j jsonb); 以及以下python代码: from decimal import * from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, DateTime from sqlalchemy.dialects.postgresql import JSONB metadata = MetaData(schema="public") foo = Table('foo', metadata,Column('f', JSONB)) d = Decimal(2) ins = foo.insert().values(j = {'d': d}) # assuming engine is a valid sqlalchemy's connection engine.execute(ins) 最后一句失败,并出现以下错误: StatementError("(builtins.TypeError) Decimal('2') is not JSON serializable",) 这就是为什么我问这个问题
  • 自定义部署到 Azure 网站(Custom Deployment to Azure Websites)
    问题 我最近开始使用 Gulp.js 将我所有的 CSS 和 JavaScript 打包成单个文件,然后我将这些文件包含在我的 Web 应用程序中。 我的网络应用程序是用 Python 编写的(使用Flask )。 我显然不想使用 git 跟踪 Gulp 输出 CSS 和 JS 文件(因为它们是构建输出文件)。 我使用推送部署将我的网站部署到 Azure 网站。 也就是说,我只需运行git push azure master ,Azure 就会自动判断我正在使用 Python,设置virtualenv ,安装pip依赖项等等。 本文介绍了如何进行设置。 这个过程很有效,但现在我已经开始使用 Gulp,我想确保在我部署网站时在服务器端也生成连接的 JavaScript 和 CSS 文件。 而且,未来我希望Azure在部署时运行所有测试,并且只有在它们都通过后才能成功部署。 遗憾的是,我还没有为这个工作流找到令人满意的解决方案,因为我无法向 Azure 的自动部署过程添加自定义步骤。 我曾尝试使用 Kudu 编写自定义部署脚本(如本博客文章所建议的那样),但这样做会禁用 Azure 通常执行的所有自动步骤; 运行azure site deploymentscript --python只生成一个非常基本的 Kudu 部署文件,它不处理读取web.config文件
  • 如何处理 Flask-Admin 表单中的有序多对多关系(关联代理)?(How to handle ordered many-to-many relationship (association proxy) in Flask-Admin form?)
    问题 我在声明性模型Page和Survey之间有一个多对多的关系,这是由关联代理中介的,因为页面在调查中出现的顺序很重要,所以交联表有一个额外的字段。 from flask.ext.sqlalchemy import SQLAlchemy from sqlalchemy.ext.associationproxy import association_proxy db = SQLAlchemy() class Page (db.Model): id = db.Column(db.Integer, primary_key = True) surveys = association_proxy('page_surveys', 'survey') class Survey (db.Model): id = db.Column(db.Integer, primary_key = True) pages = association_proxy('survey_pages', 'page') class SurveyPage (db.Model): survey_id = db.Column(db.Integer, db.ForeignKey('survey.id'), primary_key = True) page_id = db.Column(db.Integer, db
  • Flask应用程序中的常见文件夹/文件结构(Common folder/file structure in Flask app)
    问题 我刚刚创建了一个flask应用程序,到目前为止,我已经为“ Hello world!”安装了一个路由器。 模板。 我想增加一点(很多)功能,但是我想知道如何构造应用程序目录。 构建Flask应用程序的最常见方法是什么? 例如,我应该为我的所有路线创建一个routes.py吗? SQLAlchemy的东西去哪儿了? 模型应该在models.py吗? 回答1 您应该在Flask文档的“模式”部分中查看“更大的应用程序”页面:http://flask.pocoo.org/docs/patterns/packages/。 这似乎是大多数人在其应用程序要求使用软件包而不是模块时遵循的模型。 我相信views.py就是您所说的routes.py 。 之后,模型将进入models.py ,表单将进入forms.py等。 回答2 FlaskApp目录的示例: /yourapp /run.py /config.py /app /__init__.py /views.py /models.py /static/ /main.css /templates/ /base.html /requirements.txt /yourappenv run.py包含将导入应用程序并启动开发服务器的实际python代码。 config.py存储您的应用程序的配置。 __init__.py初始化您的应用程序
  • Google App Engine中的自定义身份验证(Custom authentication in Google App Engine)
    问题 有谁知道或知道我可以学习如何使用Python和Google App Engine创建自定义身份验证过程的地方? 我不想使用Google帐户进行身份验证,也希望能够创建自己的用户。 如果不是专门针对Google App Engine,是否有关于如何使用Python和Django实现身份验证的资源? 回答1 django 1.0今天在Google AppEngine上进行了更新。 但是您可以使用户身份验证像其他任何您实际上不能使用的会话一样使用,因为它是如此之大。 http://gaeutilities.appspot.com/中有一个会话实用程序 http://gaeutilities.appspot.com/session http://code.google.com/p/gaeutilities/ 或者, 您必须创建自己的用户表并进行哈希处理或加密密码,然后可能创建一个令牌系统,该系统仅使用令牌哈希或uuid cookie来模拟会话(会话始终只是cookie)。 我已经用基本的google.webapp请求和响应标头实现了一些。 我通常使用uuid作为主键作为用户ID,然后对用户密码进行加密,并让其电子邮件进行重置。 如果您想授权用户外部访问数据,可以查看OAuth进行应用程序访问。 如果您只想按ID存储数据并且面向更多用户
  • 如何在`flask-admin`中强制执行约束?(How to enforce constraints in `flask-admin`?)
    问题 我们使用 http://flask-admin.readthedocs.org/ 作为快速管理界面。 我们的模型具有如下定义的约束: __table_args__ = ( db.UniqueConstraint(user_id, role, domain_id), db.UniqueConstraint(user_id, role, customer_id), ) 在调试模式下保存违反约束的记录时,应用程序会停止并进行回溯。 如果不在调试模式下,它会在快速消息中报告错误并回滚事务。 这是所需的行为(即闪现消息和回滚)。 用户做错了什么并且被保护不会输入错误数据:这不是应该显示回溯的错误。 优雅地处理此类异常的正确 Flask 方法是什么? 我应该重写{create,update,delete}_model的方法ModelView ? 回答1 您可以实现 on_model_change 和 on_model_delete 函数。 因此,您可以检查数据是否唯一,并在不满足约束的情况下提供更用户友好的消息。 这是在删除/插入/更新操作之前检查一些约束的示例 class ExampleView(ModelView): def on_model_delete(self, model): #check constraint def on_model_change(self, form