首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用flask-admin,我如何获得一个支持不存在的标签的标签字段?

使用flask-admin,我如何获得一个支持不存在的标签的标签字段?
EN

Stack Overflow用户
提问于 2013-05-01 21:42:59
回答 2查看 2.1K关注 0票数 4

我得到了两个模型Product和Tag,并在SQLAlchemy中设置了多对多关系。使用它作为flask-admin示例,可以看到:

代码语言:javascript
复制
 admin.add_view(ProductAdmin(db.session))

我得到了一个创建表单,并且只能选择已存在的标签。我知道flask-admin正在使用select2,而select2得到了一种添加新标签的风格。我在flask-admin文件夹下的Form.py中找到了Slect2TagsField类。

那么,如何使用flask-admin在我的产品创建表单中获得一个支持添加新标签的标签域?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-02 15:00:25

不幸的是,Flask-Admin不公开任何AJAX端点,因此不可能在Select2字段中创建新模型。

但是,还是有办法让它工作的:

从管理form

  • Contribute新模型中排除标记字段到具有不同名称的表单(因此没有显示新/编辑视图的名称collision)

  • Before,将标记列表序列化为字符串数组并为模型提交模型( Select2TagsField

  • Before tags

  • Contribute

  • Select2TagsField,on_model_change)检查列表,执行数据库查找以查找现有标记,并为模型

创建缺少的模型标记模型列表

票数 1
EN

Stack Overflow用户

发布于 2016-12-15 13:59:16

您可以创建自己的TagField并将其添加到您的ModelView.中,您必须覆盖某些字段函数。

我已经编写了一个 ,它使用select2版本4,并且比这个答案更详细。

标签字段:

代码语言:javascript
复制
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字段)

代码语言:javascript
复制
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)

在您的管理员中:

代码语言:javascript
复制
form_extra_fields = {
        'tags': CustomTagField(
            'Tags',
        ),
}

然后覆盖您的管理模板,在您的字段上以标记模式调用select2 (admin/js/form.js也会尝试设置字段样式):

代码语言:javascript
复制
$('#tags').select2({
  tags: true,
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16319250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档