我得到了两个模型Product和Tag,并在SQLAlchemy中设置了多对多关系。使用它作为flask-admin示例,可以看到:
admin.add_view(ProductAdmin(db.session))我得到了一个创建表单,并且只能选择已存在的标签。我知道flask-admin正在使用select2,而select2得到了一种添加新标签的风格。我在flask-admin文件夹下的Form.py中找到了Slect2TagsField类。
那么,如何使用flask-admin在我的产品创建表单中获得一个支持添加新标签的标签域?
提前谢谢。
发布于 2013-05-02 15:00:25
不幸的是,Flask-Admin不公开任何AJAX端点,因此不可能在Select2字段中创建新模型。
但是,还是有办法让它工作的:
从管理form
创建缺少的模型标记模型列表
发布于 2016-12-15 13:59:16
您可以创建自己的TagField并将其添加到您的ModelView.中,您必须覆盖某些字段函数。
我已经编写了一个 ,它使用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,
});https://stackoverflow.com/questions/16319250
复制相似问题