4

Product と Tag の 2 つのモデルを取得し、SQLAlchemy で多対多の関係を設定しました。これをフラスコ管理者の例として使用すると、次のようになります。

 admin.add_view(ProductAdmin(db.session))

作成フォームが表示され、既存のタグのみを選択できます。フラスコ管理者がselect2を使用していることは知っています.select2は新しいタグを追加するスタイルを取得します。そして、flask-admin フォルダーの下の Form.py にクラス Slect2TagsField が見つかりました。

では、flask-admin を使用して、製品作成フォームで新しいタグの追加をサポートするタグ フィールドを取得するにはどうすればよいでしょうか?

前もって感謝します。

4

2 に答える 2

1

独自のものを作成して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,
});
于 2016-12-15T05:59:16.023 に答える