1

私のプロジェクトでは、djangoインラインフォームセットを使用しています。jqueryでフォームセットのクローンを作成しましたが、残念ながら、クローンされたフォームの名前とIDは同じであるため、最後のフォームに入力したデータが最初のフォームのデータを上書きします。何が間違っているのでしょうか?

スクリプトは次のとおりです。

<script type="text/javascript">>
function cloneMore(selector, type) {
    var newElement = $(selector).clone(true);
    var total = $('#id_' + type + '-TOTAL_FORMS').val();
    newElement.find(':input').each(function() {
        var name = $(this).attr('name').replace('-' + (total-1) + '-','-' + total + '-');   
        var id = 'id_' + name;
        $(this).attr({'name': name, 'id': id}).val('').removeAttr('checked');
    });
    newElement.find('label').each(function() {
        var newFor = $(this).attr('for').replace('-' + (total-1) + '-','-' + total + '-');  
        $(this).attr('for', newFor); 
    }); 
    total++;
    $('#id_' + type + '-TOTAL_FORMS').val(total);
    $(selector).after(newElement);
}

</script>
4

2 に答える 2

1

私は同じ目的でCloneMore.jsスクリプトを使用しています(私のバージョンはこの時点で変更されています)。これが当てはまるかどうかはわかりませんが、JavaScriptで変更されているフィールドがある場合は、そのフィールドを再初期化する必要があります。たとえば、uniform.jsセレクター、datepickers、またはオートコンプリートフィールドをリセットする必要がある場合があります。

クローンボタンを押したときにこれらの問題のいくつかに対処するためのコードのスニペットを次に示します。また、これらが内にあることに注意してくださいlive()

// #add_more is my button to add a formset
$('#add_more').live('click',function() { 
    cloneMore('div.line_item:last', 'lineitem');
    $(".line_item:last").find('.hasDatepicker').each(function() {
        // remove then initialize datepicker
        $(this).removeClass("hasDatepicker").datepicker( {dateFormat:'mm/dd/yy'} );
    });
    $(".line_item:last").find('.autocomplete_field').each(function() {
        // remove then initialize autocomplete
        $(this).autocomplete('destroy');
        // enable_autocomplete is a custom function, but it's basically just 
        // $(this).autocomplete({ options... })
        enable_autocomplete($(this), cust_part_url);
    });
});

編集:私はこのSO回答がcloneMoreスクリプトの起源だと思います

于 2012-05-30T16:25:14.100 に答える
1

djangoフォームセットの各フォームには、djangoの一種のIDとして機能する一意の名前属性が提供されます。つまり、フォームセットの最初のフォームを複製すると、そのIDも複製されるため、最初のフォームが上書きされます。形。

Baseformsetによって提供されるempty_form使用/複製{{form.empty_form}}し、適切な名前を指定して、-TOTAL_FORMS

于 2012-05-30T13:07:48.520 に答える