独自のものを作成して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,
});