21

これが私がやっている方法です:

{{ formset.management_form }}
<table>
    {% for form in formset.forms %}
        {{ form }}
    {% endfor %}
</table>
<a href="javascript:void(0)" id="add_form">Add Form</a>   

そして、ここにJSがあります:

var form_count = {{formset.total_form_count}};
$('#add_form').click(function() {
    form_count++;
    var form = '{{formset.empty_form|escapejs}}'.replace(/__prefix__/g, form_count);
    $('#forms').append(form)
    $('#id_form-TOTAL_FORMS').val(form_count);
});

特に気になるのは、そのescapejsテンプレート タグを自分で書かなければならなかったことです。文字列を台無しにしないように、すべての改行を取り除き、一重引用符をエスケープするだけです。しかし、Django の作成者は、この状況で私たちが何をすることを正確に期待していたのでしょうか? そして、配列を使用して代わりにその長さを数えることができたのに、なぜこのTOTAL_FORMS隠しフィールドがあるのでしょうか?<input name="my_form_field[0]" />

4

5 に答える 5

7

Django には、「理由」が Django 管理アプリの実装方法であるという理由がいくつかありますが、これはその 1 つだと思います。したがって、答えは、独自の JavaScript を実装することを期待しているということです。

このSOの質問を参照してください動的にフォームを追加しています... JavaScriptのアイデアについては、

django-dynamic-formsetdjango-dinamyc-form という2 つのプラグイン可能なアプリも利用できます。最初のアプリを調べたときに、今まで見たことがありませんでした。

于 2010-03-01T18:56:15.233 に答える
4

この質問は少し古いですが、これを理解するのにも時間がかかりました。

テンプレートで formset.empty_form を非表示フィールドとしてレンダリングし、JavaScript でこのフィールドを参照することをお勧めします。

django 管理サイトからの複雑な動的フォームセットの例を次に示します (ただし、empty_form を使用するように更新されていないことに注意してください....)

[js] http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/media/js/inlines.js

[html テンプレート] http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/templates/admin/edit_inline/tabular.html

于 2010-08-11T00:44:46.557 に答える
2

これは、通常の HTTP ワークフローのみを使用して、フォームセットがjavascript なしで動作するように作成されているためです。

Django は JavaScript に依存しません。

ミックスに JavaScript を追加したい場合は、専用の jquery プラグインを使用できます。

于 2012-01-04T19:55:08.107 に答える
1

私の場合。プラグイン django-dynamic-formset を使用しました ( https://code.google.com/p/django-dynamic-formset/wiki/Usage )

オプション「追加」を変更し、うまくいきました。

        $('#formset-table tbody tr').formset({
            prefix: '{{ formset.prefix }}',
            formCssClass: '{{ formset.prefix }}-inlineformset',
            added: function(obj_tr){ 
                var form = $(obj_tr).html().replace(/\-(\w+)\-(\w+)(fix__)\-/g, '-');
                $(obj_tr).html(form);

           },

この正規表現は、文字列 [prefix]- prefix peer '-'を置き換えます

最善の解決策ではないかもしれませんが、うまくいきました。

于 2013-10-04T12:45:26.573 に答える
1

実際のフォームセット フォーム インデックスformset.empty_formに置き換えて文字列として使用すると、XSS の可能性がある場合がいくつかあります。'__prefix__'私のプラグ可能なアプリケーションformset.empty_formは Knockout.js テンプレートに変換され、カスタム Knockout.js バインディングを介して複製されます。また、インラインフォームセットを含むフォーム全体が送信される前に、新しく追加されたフォームセットフォームが動的に削除されると、Knockout.js はフォームフィールド ID インデックスを自動的に再計算します。ドキュメントは次のとおりです。

https://django-jinja-knockout.readthedocs.org/en/latest/forms.html#dynamically-adding-new-related-formset-forms

Knockout.js バインディングは、インライン Javascript を使用してカスタム フィールドをロードする際の XSS も防ぎます。

于 2016-03-18T08:06:37.403 に答える