使用flask-admin,如何获得支持不存在标签的标签字段?
Posted
技术标签:
【中文标题】使用flask-admin,如何获得支持不存在标签的标签字段?【英文标题】:Using flask-admin, how can I get a tag field supporting un-existed tags? 【发布时间】:2013-04-25 12:23:03 【问题描述】:我有两个模型 Product 和 Tag,并在 SQLAlchemy 中设置了多对多关系。 使用它作为烧瓶管理示例显示:
admin.add_view(ProductAdmin(db.session))
我得到一个创建表单,并且只能选择现有的标签。 我知道烧瓶管理员正在使用 select2,并且 select2 获得了添加新标签的风格。 我在flask-admin文件夹下的Form.py中找到了类Slect2TagsField。
那么,如何使用flask-admin在我的产品创建表单中获得一个支持添加新标签的标签字段?
提前致谢。
【问题讨论】:
很遗憾,Flask-Admin 不支持内联标签创建,因为没有可以注册新标签的 AJAX 端点。 谢谢,乔斯。但是为什么flask-admin文件夹下的form.py中有一个Select2TagsField类呢?我可以用它来实现内联标签创建功能吗?谢谢。 目前它用于 PostgreSQL Array 数据类型。也可以手动用于非 SQL 后端,例如带有嵌套列表的 pymongo/mongoengine。 【参考方案1】:不幸的是,Flask-Admin 没有公开任何 AJAX 端点,因此无法在 Select2 字段中创建新模型。
但是,有办法让它工作:
-
从管理表单中排除标签字段
将新的 Select2TagsField 贡献给具有不同名称的表单(因此没有名称冲突)
在显示新/编辑视图之前,将标签列表序列化为字符串数组并贡献给 Select2TagsField
在提交模型 (on_model_change) 之前检查列表,进行数据库查找以查找现有标签并为缺少的标签创建模型
为模型贡献标签模型列表
【讨论】:
这对我来说太复杂了,我是 python 新手,对不起......我自己写了我的管理页面,flask-admin 对于普通模型来说非常简单。 你有没有想过创造这个要点? 你有没有想过创造这个要点?我很困惑。 更像是人们变得懒惰并想要准备好使用的解决方案。答案就足够了——您只需添加自定义逻辑来处理发送到服务器的值并在 on_model_change 方法中创建必要的模型。【参考方案2】:您可以创建自己的TagField
并将其添加到您的ModelView.
您将不得不覆盖一些字段函数。
我整理了一个demo application,它使用 select2 版本 4,比这个答案更详细。
标签字段:
class CustomTagField(Select2TagsField):
widget = CustomTagWidget(multiple=True)
def pre_validate(self, form):
pass
def process_formdata(self, valuelist):
if valuelist:
self.data = []
for tagname in valuelist:
rv = Tag.query.filter_by(name=tagname).first()
if rv:
self.data.append(rv)
else:
self.data.append(Tag(name=tagname))
else:
self.data = []
def iter_choices(self):
self.blank_text = ""
tags = list(set([str(tag.name) for tag in Tag.query.all()]))
model_tags = [tag.name for tag in self.object_data]
self.choices = [[tag, tag] for tag in tags]
# Yield empty object in order to have an empty placeholder
yield (u'__None', self.blank_text, self.data is None)
for value, label in self.choices:
yield (value, label, value in model_tags)
自定义小部件:(类似于Select2TagsWidget
,但未设置data-role
,因此form.js
不会使其成为常规select2 字段)
class CustomTagWidget(widgets.Select):
def __call__(self, field, **kwargs):
kwargs.setdefault('data-tags', '1')
# Or call select2 in tags mode
allow_blank = getattr(field, 'allow_blank', False)
if allow_blank and not self.multiple:
kwargs['data-allow-blank'] = u'1'
return super(CustomTagWidget, self).__call__(field, **kwargs)
在您的管理员中:
form_extra_fields =
'tags': CustomTagField(
'Tags',
),
然后覆盖您的管理模板以在您的字段上以标记模式调用 select2(admin/js/form.js
也会尝试设置该字段的样式):
$('#tags').select2(
tags: true,
);
【讨论】:
以上是关于使用flask-admin,如何获得支持不存在标签的标签字段?的主要内容,如果未能解决你的问题,请参考以下文章